{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8BrLuyU3kMdt"
      },
      "source": [
        "# Training a Normalizing Flow on QM9\n",
        "By [Nathan C. Frey](https://ncfrey.github.io/) | [Twitter](https://twitter.com/nc_frey)\n",
        "\n",
        "\n",
        "In this tutorial, we will train a Normalizing Flow (NF) on the [QM9 dataset](https://www.nature.com/articles/sdata201422). The dataset comprises 133,885 stable small organic molecules made up of CHNOF atoms. We will try to train a network that is an invertible transformation between a simple base distribution and the distribution of molecules in QM9.  One of the key advantages of normalizing flows is that they can be constructed to efficiently sample from a distribution (generative modeling) and do probability density calculations (exactly compute log-likelihoods), whereas other models make tradeoffs between the two or can only approximate probability densities. This work has been published and considered as FastFlows see [reference](https://arxiv.org/abs/2201.12419).\n",
        "\n",
        "NFs are useful whenever we need a probabilistic model with one or both of these capabilities. Note that because NFs are completely invertible, there is no \"latent space\" in the sense used when referring to generative adversarial networks or variational autoencoders. For more on NFs, we refer to this [review paper](https://arxiv.org/pdf/1912.02762.pdf).\n",
        "\n",
        "\n",
        "To encode the QM9 dataset, we'll make use of the SELFIES (SELF-referencIng Embedded Strings) representation, which is a 100% robust molecular string representation. SMILES strings produced by generative models are often syntactically invalid (they do not correspond to a molecular graph), or they violate chemical rules like the maximum number of bonds between atoms. SELFIES are designed so that even totally random SELFIES strings correspond to valid molecular graphs, so they are a great framework for generative modeling. For more details about SELFIES, see the [GitHub repo](https://github.com/aspuru-guzik-group/selfies) and the associated [paper](https://arxiv.org/abs/1905.13741).\n",
        "\n",
        "\n",
        "## Colab\n",
        "\n",
        "This tutorial and the rest in this sequence are designed to be done in Google colab. If you'd like to open this notebook in colab, you can use the following link.\n",
        "\n",
        "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/deepchem/deepchem/blob/master/examples/tutorials/23_Training_a_Normalizing_Flow_on_QM9.ipynb)\n",
        "\n",
        "## Setup\n",
        "\n",
        "To run DeepChem within Colab, you'll need to run the following cell of installation commands. This will take about 5 minutes to run to completion and install your environment."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 252
        },
        "id": "dVXJOn-p8Pld",
        "outputId": "5de6622a-f72e-433e-d65e-6a19ec27d740"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Requirement already satisfied: deepchem in /usr/local/lib/python3.7/dist-packages (2.6.1)\n",
            "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from deepchem) (1.3.5)\n",
            "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.7/dist-packages (from deepchem) (1.0.2)\n",
            "Requirement already satisfied: numpy>=1.21 in /usr/local/lib/python3.7/dist-packages (from deepchem) (1.21.5)\n",
            "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from deepchem) (1.4.1)\n",
            "Requirement already satisfied: joblib in /usr/local/lib/python3.7/dist-packages (from deepchem) (1.1.0)\n",
            "Requirement already satisfied: rdkit-pypi in /usr/local/lib/python3.7/dist-packages (from deepchem) (2021.9.5.1)\n",
            "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas->deepchem) (2018.9)\n",
            "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->deepchem) (2.8.2)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->deepchem) (1.15.0)\n",
            "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from rdkit-pypi->deepchem) (7.1.2)\n",
            "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->deepchem) (3.1.0)\n"
          ]
        },
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            },
            "text/plain": [
              "'2.6.1'"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "!pip install --pre deepchem\n",
        "import deepchem\n",
        "deepchem.__version__"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OGVYBZh6Gq7N"
      },
      "source": [
        "Install the SELFIES library to translate SMILES strings."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "sqEygLk5GLYF",
        "outputId": "f09f45e7-75a0-4f6b-8d35-31f61666ec5f"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Requirement already satisfied: selfies in /usr/local/lib/python3.7/dist-packages (2.0.0)\n"
          ]
        }
      ],
      "source": [
        "!pip install selfies"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "id": "FpqPgmalHCdb"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "import pandas as pd\n",
        "import os\n",
        "\n",
        "import deepchem as dc\n",
        "from deepchem.models.normalizing_flows import NormalizingFlow, NormalizingFlowModel\n",
        "from deepchem.models.optimizers import Adam\n",
        "from deepchem.data import NumpyDataset\n",
        "from deepchem.splits import RandomSplitter\n",
        "from deepchem.molnet import load_tox21\n",
        "\n",
        "import rdkit\n",
        "from rdkit import Chem\n",
        "from rdkit.Chem.Draw import IPythonConsole\n",
        "from rdkit.Chem import Draw\n",
        "\n",
        "from IPython.display import Image, display\n",
        "\n",
        "import selfies as sf\n",
        "\n",
        "import tensorflow as tf\n",
        "import tensorflow_probability as tfp\n",
        "\n",
        "tfd = tfp.distributions\n",
        "tfb = tfp.bijectors\n",
        "tfk = tf.keras\n",
        "\n",
        "tfk.backend.set_floatx('float64')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XYRunI2yHoLS"
      },
      "source": [
        "First, let's get a dataset of 2500 small organic molecules from the QM9 dataset. We'll then convert the molecules to SELFIES, one-hot encode them, and dequantize the inputs so they can be processed by a normalizing flow. 2000 molecules will be used for training, while the remaining 500 will be split into validation and test sets. We'll use the validation set to see how our architecture is doing at learning the underlying the distribution, and leave the test set alone. You should feel free to experiment with this notebook to get the best model you can and evaluate it on the test set when you're done!"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "id": "k2-L2gFHr04H"
      },
      "outputs": [],
      "source": [
        "# Download from MolNet\n",
        "tasks, datasets, transformers = dc.molnet.load_qm9(featurizer='ECFP')\n",
        "df = pd.DataFrame(data={'smiles': datasets[0].ids})"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "fdo6CJMPGyig"
      },
      "outputs": [],
      "source": [
        "data = df[['smiles']].sample(2500, random_state=42)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ZMh-1QUqCxkY"
      },
      "source": [
        "SELFIES defines a dictionary called `bond_constraints` that enforces how many bonds every atom or ion can make. E.g., 'C': 4, 'H': 1, etc. The `?` symbol is used for any atom or ion that isn't defined in the dictionary, and it defaults to 8 bonds. Because QM9 contains ions and we don't want to allow those ions to form up to 8 bonds, we'll constrain them to 3. This will really improve the percentage of valid molecules we generate. You can read more about setting constraints in the [SELFIES documentation](https://selfies-mirror.readthedocs.io/en/latest/selfies_examples.html#Advanced-Usage)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "6cOS0cNTdb0I",
        "outputId": "06824b73-acfe-4072-b08f-07814076afbe"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'?': 3,\n",
              " 'B': 3,\n",
              " 'B+1': 2,\n",
              " 'B-1': 4,\n",
              " 'Br': 1,\n",
              " 'C': 4,\n",
              " 'C+1': 5,\n",
              " 'C-1': 3,\n",
              " 'Cl': 1,\n",
              " 'F': 1,\n",
              " 'H': 1,\n",
              " 'I': 1,\n",
              " 'N': 3,\n",
              " 'N+1': 4,\n",
              " 'N-1': 2,\n",
              " 'O': 2,\n",
              " 'O+1': 3,\n",
              " 'O-1': 1,\n",
              " 'P': 5,\n",
              " 'P+1': 6,\n",
              " 'P-1': 4,\n",
              " 'S': 6,\n",
              " 'S+1': 7,\n",
              " 'S-1': 5}"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "sf.set_semantic_constraints()  # reset constraints\n",
        "constraints = sf.get_semantic_constraints()\n",
        "constraints['?'] = 3\n",
        "\n",
        "sf.set_semantic_constraints(constraints)\n",
        "constraints"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "id": "2N5zUFvSV7uv"
      },
      "outputs": [],
      "source": [
        "def preprocess_smiles(smiles):\n",
        "  return sf.encoder(smiles)  \n",
        "\n",
        "def keys_int(symbol_to_int):\n",
        "  d={}\n",
        "  i=0\n",
        "  for key in symbol_to_int.keys():\n",
        "    d[i]=key\n",
        "    i+=1\n",
        "  return d\n",
        "\n",
        "data['selfies'] = data['smiles'].apply(preprocess_smiles)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rAriEcI7e5wl"
      },
      "source": [
        "Let's take a look at some short SMILES strings and their corresponding SELFIES representations. We can see right away that there is a key difference in how the two representations deal with Rings and Branches. SELFIES is designed so that branch length and ring size are stored locally with the `Branch` and `Ring` identifiers, and the SELFIES grammar prevents invalid strings."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 206
        },
        "id": "2dqSCmoPe30e",
        "outputId": "5462d628-9858-4ea7-9f34-d26ea0a21d77"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "\n",
              "  <div id=\"df-ca3ad90a-e71d-4d08-bda4-4e88bf841ba9\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>smiles</th>\n",
              "      <th>selfies</th>\n",
              "      <th>len</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>6728</th>\n",
              "      <td>[H]c1nnc([H])o1</td>\n",
              "      <td>[H][C][=N][N][=C][Branch1][C][H][O][Ring1][=Br...</td>\n",
              "      <td>15</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>72803</th>\n",
              "      <td>[H]c1nnnc([H])n1</td>\n",
              "      <td>[H][C][=N][N][=N][C][Branch1][C][H][=N][Ring1]...</td>\n",
              "      <td>16</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>97670</th>\n",
              "      <td>[H]c1onnc1C(F)(F)F</td>\n",
              "      <td>[H][C][O][N][=N][C][=Ring1][Branch1][C][Branch...</td>\n",
              "      <td>18</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25487</th>\n",
              "      <td>[H]n1nnc(C#CC#N)n1</td>\n",
              "      <td>[H][N][N][=N][C][Branch1][Branch1][C][#C][C][#...</td>\n",
              "      <td>18</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>32004</th>\n",
              "      <td>[H]C#Cc1nnc(F)nc1[H]</td>\n",
              "      <td>[H][C][#C][C][=N][N][=C][Branch1][C][F][N][=C]...</td>\n",
              "      <td>20</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-ca3ad90a-e71d-4d08-bda4-4e88bf841ba9')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-ca3ad90a-e71d-4d08-bda4-4e88bf841ba9 button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-ca3ad90a-e71d-4d08-bda4-4e88bf841ba9');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ],
            "text/plain": [
              "                     smiles  \\\n",
              "6728        [H]c1nnc([H])o1   \n",
              "72803      [H]c1nnnc([H])n1   \n",
              "97670    [H]c1onnc1C(F)(F)F   \n",
              "25487    [H]n1nnc(C#CC#N)n1   \n",
              "32004  [H]C#Cc1nnc(F)nc1[H]   \n",
              "\n",
              "                                                 selfies  len  \n",
              "6728   [H][C][=N][N][=C][Branch1][C][H][O][Ring1][=Br...   15  \n",
              "72803  [H][C][=N][N][=N][C][Branch1][C][H][=N][Ring1]...   16  \n",
              "97670  [H][C][O][N][=N][C][=Ring1][Branch1][C][Branch...   18  \n",
              "25487  [H][N][N][=N][C][Branch1][Branch1][C][#C][C][#...   18  \n",
              "32004  [H][C][#C][C][=N][N][=C][Branch1][C][F][N][=C]...   20  "
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "data['len'] = data['smiles'].apply(lambda x: len(x))\n",
        "data.sort_values(by='len').head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NrQelTLVa7wR"
      },
      "source": [
        "To convert SELFIES to a one-hot encoded representation, we need to construct an `alphabet` of all the characters that occur in the list of SELFIES strings. We also have to know what the longest SELFIES string is, so that all the shorter SELFIES can be padded with `'[nop]'` to be equal length."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "id": "BkQ0Sd3TY3Aq"
      },
      "outputs": [],
      "source": [
        "selfies_list = np.asanyarray(data.selfies)\n",
        "selfies_alphabet = sf.get_alphabet_from_selfies(selfies_list)\n",
        "selfies_alphabet.add('[nop]')  # Add the \"no operation\" symbol as a padding character\n",
        "selfies_alphabet.add('.') \n",
        "selfies_alphabet = list(sorted(selfies_alphabet))\n",
        "largest_selfie_len = max(sf.len_selfies(s) for s in selfies_list)\n",
        "symbol_to_int = dict((c, i) for i, c in enumerate(selfies_alphabet))\n",
        "int_mol=keys_int(symbol_to_int)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vQ2m_WoHt7_m"
      },
      "source": [
        "`selfies` has a handy utility function to translate SELFIES strings into one-hot encoded vectors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "id": "N9-d9yYMZSgI"
      },
      "outputs": [],
      "source": [
        "onehots=sf.batch_selfies_to_flat_hot(selfies_list, symbol_to_int,largest_selfie_len)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "daU67TZZbbLa"
      },
      "source": [
        "Next, we \"dequantize\" the inputs by adding random noise from the interval `[0, 1)` to every input in the encodings. This allows the normalizing flow to operate on continuous inputs (rather than discrete), and the original inputs can easily be recovered by applying a floor function."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "id": "u3ThEWVcbvxn"
      },
      "outputs": [],
      "source": [
        "input_tensor = tf.convert_to_tensor(onehots, dtype='float64')\n",
        "noise_tensor = tf.random.uniform(shape=input_tensor.shape, minval=0, maxval=1, dtype='float64')\n",
        "dequantized_data = tf.add(input_tensor, noise_tensor)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "B38gEbh6uLrr"
      },
      "source": [
        "The dequantized data is ready to be processed as a DeepChem dataset and split into training, validation, and test sets. We'll also keep track of the SMILES strings for the training set so we can compare the training data to our generated molecules later on."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "O3JqekV0HjNm",
        "outputId": "30647284-f790-4cbb-fb2a-2a3f221ca2f5"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(2000, 2596)"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "ds = NumpyDataset(dequantized_data)  # Create a DeepChem dataset\n",
        "splitter = RandomSplitter()\n",
        "train, val, test = splitter.train_valid_test_split(dataset=ds, seed=42)\n",
        "train_idx, val_idx, test_idx = splitter.split(dataset=ds, seed=42)\n",
        "\n",
        "dim = len(train.X[0])  # length of one-hot encoded vectors\n",
        "train.X.shape  # 2000 samples, N-dimensional one-hot vectors that represent molecules"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "id": "9In8bdWddovm"
      },
      "outputs": [],
      "source": [
        "# SMILES strings of training data\n",
        "train_smiles = data['smiles'].iloc[train_idx].values"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yZmmABKzI00F"
      },
      "source": [
        "Next we'll set up the normalizing flow model. The base distribution is a multivariate Normal distribution. The `permutation` layer permutes the dimensions of the input so that the normalizing flow layers will operate along multiple dimensions of the inputs. To understand why the permutation is needed, we need to know a bit about how the normalizing flow architecture works."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "id": "W_Ff2Q4rIyCe"
      },
      "outputs": [],
      "source": [
        "base_dist = tfd.MultivariateNormalDiag(loc=np.zeros(dim), scale_diag=np.ones(dim))\n",
        "\n",
        "if dim % 2 == 0:\n",
        "    permutation = tf.cast(np.concatenate((np.arange(dim / 2, dim), np.arange(0, dim / 2))),\n",
        "                                  tf.int32)\n",
        "else:\n",
        "    permutation = tf.cast(np.concatenate((np.arange(dim / 2 + 1, dim), np.arange(0, dim / 2))), tf.int32)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FMCyGvKKJwXw"
      },
      "source": [
        "For this simple example, we'll set up a flow of repeating [Masked Autoregressive Flow](https://arxiv.org/abs/1705.07057) layers. The autoregressive property is enforced by using the [Masked Autoencoder for Distribution Estimation](https://arxiv.org/abs/1502.03509) architecture. The layers of the flow are a bijector, an invertible mapping between the base and target distributions.\n",
        "\n",
        "MAF takes the inputs from the base distribution and transforms them with a simple scale-and-shift (affine) operation, but crucially the scale-and-shift for each dimension of the output *depends on the previously generated dimensions of the output.* That independence of future dimensions preserves the *autoregressive* property and ensures that the normalizing flow is invertible. Now we can see that we need permutations to change the ordering of the inputs, or else the normalizing flow would only transform certain dimensions of the inputs.\n",
        "\n",
        "Batch Normalization layers can be added for additional stability in training, but may have strange effects on the outputs and require some input reshaping to work properly. Increasing `num_layers` and `hidden_units` can make more expressive flows capable of modeling more complex target distributions."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "id": "byIooYBqJ2UC"
      },
      "outputs": [],
      "source": [
        "num_layers = 8\n",
        "flow_layers = []\n",
        "\n",
        "Made = tfb.AutoregressiveNetwork(params=2,\n",
        "                                 hidden_units=[512, 512], activation='relu')\n",
        "\n",
        "for i in range(num_layers):\n",
        "    flow_layers.append(        \n",
        "        (tfb.MaskedAutoregressiveFlow(shift_and_log_scale_fn=Made)\n",
        "    ))\n",
        "\n",
        "    permutation = tf.cast(np.random.permutation(np.arange(0, dim)), tf.int32)\n",
        "    \n",
        "    flow_layers.append(tfb.Permute(permutation=permutation))\n",
        "    \n",
        "#     if (i + 1) % int(2) == 0:\n",
        "#         flow_layers.append(tfb.BatchNormalization())"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KMbxkF_8KZxR"
      },
      "source": [
        "We can draw samples from the untrained distribution, but for now they don't have any relation to the QM9 dataset distribution."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hBYNQrAYKQij",
        "outputId": "b08bb3dd-228d-49c1-ab8d-507ee08016dd"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "CPU times: user 280 ms, sys: 10.2 ms, total: 290 ms\n",
            "Wall time: 289 ms\n"
          ]
        }
      ],
      "source": [
        "%%time\n",
        "nf = NormalizingFlow(base_distribution=base_dist,\n",
        "                    flow_layers=flow_layers)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pa04f-1VcG0p"
      },
      "source": [
        "A `NormalizingFlowModel` takes a `NormalizingFlow` and any parameters used by `deepchem.models.KerasModel`."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "id": "iA56ui2MK1QA"
      },
      "outputs": [],
      "source": [
        "nfm = NormalizingFlowModel(nf, learning_rate=1e-4, batch_size=128)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "IL-Onju8K8nK"
      },
      "source": [
        "Now to train the model! We'll try to minimize the negative log likelihood loss, which measures the likelihood that generated samples are drawn from the target distribution, i.e. as we train the model, it should get better at modeling the target distribution and it will generate samples that look like molecules from the QM9 dataset. "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "id": "ZrmHYIHGK7-l"
      },
      "outputs": [],
      "source": [
        "losses = []\n",
        "val_losses = []"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "vIURsPTpLZdh",
        "outputId": "e0557ec9-c4d1-495c-f4ab-79591a10466b"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "WARNING:tensorflow:Model was constructed with shape (None, 2596) for input KerasTensor(type_spec=TensorSpec(shape=(None, 2596), dtype=tf.float64, name='input_1'), name='input_1', description=\"created by layer 'input_1'\"), but it was called on an input with incompatible shape (1, 128, 2596).\n",
            "CPU times: user 13min 40s, sys: 20.9 s, total: 14min 1s\n",
            "Wall time: 7min 27s\n"
          ]
        }
      ],
      "source": [
        "%%time\n",
        "max_epochs = 10 # maximum number of epochs of the training\n",
        "\n",
        "for epoch in range(max_epochs):\n",
        "  loss = nfm.fit(train, nb_epoch=1, all_losses=losses)\n",
        "  val_loss = nfm.create_nll(val.X)\n",
        "  val_losses.append(val_loss.numpy())"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 267
        },
        "id": "k33LyZsPNwUg",
        "outputId": "a4f54aa7-cf3c-4a76-b40e-cd6f645f8523"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD6CAYAAABNu5eFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAfcUlEQVR4nO3de5RV9X338ffHYZAhKhCdIDA0YBchcgvIYHnK4yUlFTARMamoNYmmUeOKidp0YcBc5KHJiglJbOlKtNRoNPECNeClmhBD8EKricNF8EYF1DIDkQFlxDIoDN/nj7MHz+AMcztnznD257XWWeec7779NsrnbH6/fVFEYGZm6XBUoRtgZmZdx6FvZpYiDn0zsxRx6JuZpYhD38wsRRz6ZmYp0mroSxosaYWkFyQ9L+mapD5XUo2ktcnr7Kxl5kjaKGmDpClZ9alJbaOk2fnZJTMza4laO09f0gBgQESslnQssAqYAcwE3o6IHx4y/wjgHuBUYCDwO+AjyeT/Bv4aqAaeAS6KiBcOt/0TTjghhgwZ0s7dMjNLr1WrVu2IiPLmpvVobeGI2AZsSz7vlvQiMOgwi5wL3BsR7wCvSNpI5gcAYGNEbAaQdG8y72FDf8iQIVRVVbXWTDMzS0h6raVp7erTlzQEGAf8ISl9RdI6SbdJ6pfUBgFbsharTmot1c3MrIu0OfQlHQP8Crg2It4Cbgb+HBhL5l8CP8pVoyRdIalKUlVtbW2uVmtmlnptCn1JpWQC/66IWAIQEa9HRENEHAD+jfe6cGqAwVmLVyS1lurvExELI6IyIirLy5vtljIzsw5otU9fkoCfAS9GxI+z6gOS/n6A84Dnks8PAndL+jGZgdxhwB8BAcMkDSUT9hcCf5urHTGzI8++ffuorq5m7969hW7KEalXr15UVFRQWlra5mVaDX1gEvA5YL2ktUnteuAiSWOBAF4FvgQQEc9LWkxmgHY/cFVENABI+gqwDCgBbouI59vcUjMrOtXV1Rx77LEMGTKEzPGltVVEsHPnTqqrqxk6dGibl2vL2TsryRylH+qRwyzzXeC7zdQfOdxyuXL/mhrmL9vA1l31DOxbxqwpw5kxzmPGZt3N3r17HfgdJInjjz+e9o57tuVI/4hy/5oa5ixZT/2+BgBqdtUzZ8l6AAe/WTfkwO+4jvzZFd1tGOYv23Aw8BvV72tg/rINBWqRmVn3UXShv3VXfbvqZpZeu3bt4qc//WmHlj377LPZtWtXm+efO3cuP/zhD1ufMc+KLvQH9i1rV93M0utwob9///7DLvvII4/Qt2/ffDQrr4ou9GdNGU5ZaUmTWllpCbOmDC9Qi8wsV+5fU8OkG3/P0NkPM+nG33P/mmYv9Wmz2bNns2nTJsaOHcusWbN47LHHOO2005g+fTojRowAYMaMGYwfP56RI0eycOHCg8sOGTKEHTt28Oqrr3LyySdz+eWXM3LkSM466yzq6w/fs7B27VomTpzImDFjOO+883jzzTcBWLBgASNGjGDMmDFceOGFADz++OOMHTuWsWPHMm7cOHbv3t2pfSYiuvVr/Pjx0V5LV1fHX35veQz5+n/EX35veSxdXd3udZhZ/r3wwgttnnfp6ur46Dd/HR/++n8cfH30m7/u1N/vV155JUaOHHnw+4oVK6J3796xefPmg7WdO3dGRMSePXti5MiRsWPHjoiI+PCHPxy1tbXxyiuvRElJSaxZsyYiIs4///z4xS9+8b5t3XDDDTF//vyIiBg9enQ89thjERHxrW99K6655pqIiBgwYEDs3bs3IiLefPPNiIj41Kc+FStXroyIiN27d8e+ffuarLe5P0OgKlrI1KI7ewcyZ+n4TB2z4nK4kzRy+ff91FNPbXLe+4IFC1i6dCkAW7Zs4eWXX+b4449vsszQoUMZO3YsAOPHj+fVV19tcf11dXXs2rWLM844A4BLLrmE888/H4AxY8Zw8cUXM2PGDGbMmAHApEmT+NrXvsbFF1/Mpz/9aSoqKjq1f0XXvWNmxamrTtL4wAc+cPDzY489xu9+9zueeuopnn32WcaNG9fs1cNHH330wc8lJSWtjge05OGHH+aqq65i9erVTJgwgf379zN79mxuvfVW6uvrmTRpEi+99FKH1t3IoW9mR4R8nKRx7LHHHraPvK6ujn79+tG7d29eeuklnn766Q5vq1GfPn3o168fTz75JAC/+MUvOOOMMzhw4ABbtmzh4x//ON///vepq6vj7bffZtOmTYwePZqvf/3rTJgwodOhX5TdO2ZWfGZNGd7kwkvo/Ekaxx9/PJMmTWLUqFFMmzaNT37yk02mT506lVtuuYWTTz6Z4cOHM3HixA5vK9sdd9zBlVdeyZ49ezjppJO4/fbbaWho4LOf/Sx1dXVEBFdffTV9+/blW9/6FitWrOCoo45i5MiRTJs2rVPbbvXJWYVWWVkZfoiKWXF68cUXOfnkk9s8v2+x8n7N/RlKWhURlc3N7yN9Mzti+CSNznOfvplZijj0zcxSxKFvZpYiDn0zsxRx6JuZpYhD38ysHY455ph21bubVkNf0mBJKyS9IOl5Sdck9fmSXpK0TtJSSX2T+hBJ9ZLWJq9bstY1XtJ6SRslLZAfmWNm1qXacqS/H/iHiBgBTASukjQCeBQYFRFjgP8G5mQtsykixiavK7PqNwOXA8OS19Rc7ISZpcS6xXDTKJjbN/O+bnGnVjd79mx+8pOfHPze+KCTt99+m8mTJ3PKKacwevRoHnjggTavMyKYNWsWo0aNYvTo0SxatAiAbdu2cfrppzN27FhGjRrFk08+SUNDA5deeunBeW+66aZO7U9btOXB6NuAbcnn3ZJeBAZFxG+zZnsa+JvDrUfSAOC4iHg6+X4nMAP4dQfbbmZpsm4xPHQ17EtusFa3JfMdYMzMDq3yggsu4Nprr+Wqq64CYPHixSxbtoxevXqxdOlSjjvuOHbs2MHEiROZPn16m55Ju2TJEtauXcuzzz7Ljh07mDBhAqeffjp33303U6ZM4Rvf+AYNDQ3s2bOHtWvXUlNTw3PPPQfQridxdVS7+vQlDQHGAX84ZNLf0TS8h0paI+lxSacltUFAddY81UnNzKx1y+e9F/iN9tVn6h00btw4tm/fztatW3n22Wfp168fgwcPJiK4/vrrGTNmDJ/4xCeoqanh9ddfb9M6V65cyUUXXURJSQn9+/fnjDPO4JlnnmHChAncfvvtzJ07l/Xr13Psscdy0kknsXnzZr761a/ym9/8huOOO67D+9JWbQ59SccAvwKujYi3surfINMFdFdS2gb8WUSMA74G3C2pXXsi6QpJVZKqamtr27OomRWruur21dvo/PPP57777mPRokVccMEFANx1113U1tayatUq1q5dS//+/Zu9pXJ7nH766TzxxBMMGjSISy+9lDvvvJN+/frx7LPPcuaZZ3LLLbdw2WWXdWobbdGm0JdUSibw74qIJVn1S4FPARcnT2shIt6JiJ3J51XAJuAjQA2Qfff/iqT2PhGxMCIqI6KyvLy83TtlZkWoTwsPD2mp3kYXXHAB9957L/fdd9/Bh5nU1dXxoQ99iNLSUlasWMFrr73W5vWddtppLFq0iIaGBmpra3niiSc49dRTee211+jfvz+XX345l112GatXr2bHjh0cOHCAz3zmM3znO99h9erVndqXtmi1Tz85w+ZnwIsR8eOs+lTgOuCMiNiTVS8H3oiIBkknkRmw3RwRb0h6S9JEMt1Dnwf+Jbe7Y2ZFa/K3m/bpA5SWZeqdMHLkSHbv3s2gQYMYMGAAABdffDHnnHMOo0ePprKyko9+9KNtXt95553HU089xcc+9jEk8YMf/IATTzyRO+64g/nz51NaWsoxxxzDnXfeSU1NDV/4whc4cOAAAN/73vc6tS9t0eqtlSX9X+BJYD1wIClfDywAjgZ2JrWnI+JKSZ8B5gH7kvlviIiHknVVAj8HysiMAXw1WmmAb61sVrzae2tl1i3O9OHXVWeO8Cd/u8ODuMUi57dWjoiVQHND1o+0MP+vyHQFNTetChjV2jbNzJo1ZmbqQ76zfEWumVmKOPTNrKC6+9P7urOO/Nk59M2sYHr16sXOnTsd/B0QEezcuZNevXq1azk/LtHMCqaiooLq6mp8PU7H9OrVi4qK9p2y6tA3s4IpLS1l6NChhW5Gqrh7x8wsRRz6ZmYp4tA3M0sRh76ZWYo49M3MUsShb2aWIg59M7MUceibmaWIQ9/MLEUc+mZmKeLQNzNLEYe+mVmKOPTNzFLEoW9mliKthr6kwZJWSHpB0vOSrknqH5T0qKSXk/d+SV2SFkjaKGmdpFOy1nVJMv/Lki7J326ZmVlz2nKkvx/4h4gYAUwErpI0ApgNLI+IYcDy5DvANGBY8roCuBkyPxLADcBfAKcCNzT+UJiZWddoNfQjYltErE4+7wZeBAYB5wJ3JLPdAcxIPp8L3BkZTwN9JQ0ApgCPRsQbEfEm8CgwNad7Y2Zmh9WuPn1JQ4BxwB+A/hGxLZn0J6B/8nkQsCVrseqk1lK9ue1cIalKUpUfo2ZmljttDn1JxwC/Aq6NiLeyp0XmqcY5e7JxRCyMiMqIqCwvL8/Vas3MUq9NoS+plEzg3xURS5Ly60m3Dcn79qReAwzOWrwiqbVUNzOzLtKWs3cE/Ax4MSJ+nDXpQaDxDJxLgAey6p9PzuKZCNQl3UDLgLMk9UsGcM9KamZm1kV6tGGeScDngPWS1ia164EbgcWSvgi8BsxMpj0CnA1sBPYAXwCIiDck/SPwTDLfvIh4Iyd7YWZmbaJMd3z3VVlZGVVVVYVuhpnZEUPSqoiobG6ar8g1M0sRh76ZWYo49M3MUsShb2aWIg59M7MUceibmaWIQ9/MLEUc+mZmKeLQNzNLEYe+mVmKOPTNzFLEoW9mliIOfTOzFHHom5mliEPfzCxFHPpmZini0DczS5HiDP11i+GmUTC3b+Z93eJCt8jMrFtoy4PRb5O0XdJzWbVFktYmr1cbn50raYik+qxpt2QtM17SekkbJS1IHriee+sWw0NXQ90WIDLvD13t4Dczo21H+j8HpmYXIuKCiBgbEWOBXwFLsiZvapwWEVdm1W8GLgeGJa8m68yZ5fNgX33T2r76TN3MLOVaDf2IeAJ4o7lpydH6TOCew61D0gDguIh4OjJPYr8TmNH+5rZBXXX76mZmKdLZPv3TgNcj4uWs2lBJayQ9Lum0pDYIyE7d6qSWe30q2lc3M0uRzob+RTQ9yt8G/FlEjAO+Btwt6bj2rlTSFZKqJFXV1ta2b+HJ34bSsqa10rJM3cws5Toc+pJ6AJ8GFjXWIuKdiNiZfF4FbAI+AtQA2YfaFUmtWRGxMCIqI6KyvLy8fQ0bMxPOWQB9BgPKvJ+zIFM3M0u5Hp1Y9hPASxFxsNtGUjnwRkQ0SDqJzIDt5oh4Q9JbkiYCfwA+D/xLZxp+WGNmOuTNzJrRllM27wGeAoZLqpb0xWTShbx/APd0YF1yCud9wJUR0TgI/GXgVmAjmX8B/DoH7Tczs3ZQ5mSa7quysjKqqqoK3QwzsyOGpFURUdnctOK8ItfMzJrl0DczSxGHvplZijj0zcxSxKFvZpYiDn0zsxRx6JuZpYhD38wsRRz6ZmYp4tA3M0sRh76ZWYo49M3MUsShb2aWIg59M7MUceibmaWIQ9/MLEUc+mZmKeLQNzNLkbY8I/c2SdslPZdVmyupRtLa5HV21rQ5kjZK2iBpSlZ9alLbKGl27nfFzMxa05Yj/Z8DU5up3xQRY5PXIwCSRpB5YPrIZJmfSiqRVAL8BJgGjAAuSuY1M7Mu1KO1GSLiCUlD2ri+c4F7I+Id4BVJG4FTk2kbI2IzgKR7k3lfaHeLzcyswzrTp/8VSeuS7p9+SW0QsCVrnuqk1lLdzMy6UEdD/2bgz4GxwDbgRzlrESDpCklVkqpqa2tzuWozs1TrUOhHxOsR0RARB4B/470unBpgcNasFUmtpXpL618YEZURUVleXt6RJpqZWTM6FPqSBmR9PQ9oPLPnQeBCSUdLGgoMA/4IPAMMkzRUUk8yg70PdrzZZmbWEa0O5Eq6BzgTOEFSNXADcKaksUAArwJfAoiI5yUtJjNAux+4KiIakvV8BVgGlAC3RcTzOd8bMzM7LEVEodtwWJWVlVFVVVXoZpiZHTEkrYqIyuam+YpcM7MUceibmaWIQ9/MLEUc+mZmKeLQNzNLEYe+mVmKOPTNzFKk1YuzrO3uX1PD/GUb2LqrnoF9y5g1ZTgzxvm+cmbWfTj0c+T+NTXMWbKe+n0NANTsqmfOkvUADn4z6zbcvZMj85dtOBj4jer3NTB/2YYCtcjM7P0c+jmydVd9u+pmZoXg0M+RgX3L2lU3MysEh36OzJoynLLSkia1stISZk0ZXqAWmZm9nwdyc6RxsNZn75hZd+bQz6EZ4wY55M2sW3P3jplZijj0zcxSxKFvZpYiDn0zsxRpNfQl3SZpu6TnsmrzJb0kaZ2kpZL6JvUhkuolrU1et2QtM17SekkbJS2QpPzskpmZtaQtR/o/B6YeUnsUGBURY4D/BuZkTdsUEWOT15VZ9ZuBy4FhyevQdZqZWZ61GvoR8QTwxiG130bE/uTr00DF4dYhaQBwXEQ8HREB3AnM6FiTzcyso3LRp/93wK+zvg+VtEbS45JOS2qDgOqseaqTWrMkXSGpSlJVbW1tDppoZmbQydCX9A1gP3BXUtoG/FlEjAO+Btwt6bj2rjciFkZEZURUlpeXd6aJZmaWpcNX5Eq6FPgUMDnpsiEi3gHeST6vkrQJ+AhQQ9MuoIqkZmZmXahDR/qSpgLXAdMjYk9WvVxSSfL5JDIDtpsjYhvwlqSJyVk7nwce6HTrzcysXVo90pd0D3AmcIKkauAGMmfrHA08mpx5+XRyps7pwDxJ+4ADwJUR0TgI/GUyZwKVkRkDyB4HMDOzLqCkZ6bbqqysjKqqqkI3w8zsiCFpVURUNjfNV+SamaWIQ9/MLEUc+mZmKeLQNzNLEYe+mVmKOPTNzFLEoW9mliIOfTOzFHHom5mliEPfzCxFHPpmZini0DczSxGHvplZijj0c2ndYrhpFMztm3lft7jQLTIza6LDT86yQ6xbDA9dDfvqM9/rtmS+A4yZWbh2mZll8ZF+riyf917gN9pXn6mbmXUTDv1cqatuX93MrAAc+rnSp6J9dTOzAmhT6Eu6TdJ2Sc9l1T4o6VFJLyfv/ZK6JC2QtFHSOkmnZC1zSTL/y5Iuyf3uFNDkb0NpWdNaaVmmbmbWTbT1SP/nwNRDarOB5RExDFiefAeYBgxLXlcAN0PmR4LMQ9X/AjgVuKHxh6IojJkJ5yyAPoMBZd7PWeBBXDPrVtp09k5EPCFpyCHlc4Ezk893AI8BX0/qd0bmietPS+oraUAy76MR8QaApEfJ/JDc06k96E7GzHTIm1m31pk+/f4RsS35/Cegf/J5ELAla77qpNZS3czMukhOBnKTo/rIxboAJF0hqUpSVW1tba5Wa2aWep0J/deTbhuS9+1JvQYYnDVfRVJrqf4+EbEwIiojorK8vLwTTTQzs2ydCf0HgcYzcC4BHsiqfz45i2ciUJd0Ay0DzpLULxnAPSupmZlZF2nTQK6ke8gMxJ4gqZrMWTg3AoslfRF4DWgcwXwEOBvYCOwBvgAQEW9I+kfgmWS+eY2DumZm1jWU6Y7vviorK6OqqqrQzej27l9Tw/xlG9i6q56BfcuYNWU4M8Z5nNwsjSStiojK5qb5hmtF4P41NcxZsp76fQ0A1OyqZ86S9QAOfjNrwrdhKALzl204GPiN6vc1MH/ZhgK1yMy6K4d+Edi6q75ddTNLL4d+ERjYt6xddTNLL4d+EZg1ZThlpSVNamWlJcyaMrxALTKz7soDuUWgcbDWZ++YWWsc+kVixrhBDnkza5W7d8zMUsShb2aWIg59M7MUcegXi3WL4aZRMLdv5n3d4kK3yMy6IQ/kFoN1i+Ghq2FfcjFW3ZbMd/CTvMysCR/pF4Pl894L/Eb76jN1M7MsDv1iUFfdvrqZpZZDvxj0qWhf3cxSy6FfDCZ/G0oPuc9OaVmmnmf3r6lh0o2/Z+jsh5l04++5f02zT8A0s27CA7nFoHGwdvm8TJdOn4pM4Od5ENf38Tc78jj0i8WYmV1+ps7h7uPv0DfrnjrcvSNpuKS1Wa+3JF0raa6kmqz62VnLzJG0UdIGSVNyswtWKL6Pv9mRp8NH+hGxARgLIKkEqAGWknkQ+k0R8cPs+SWNAC4ERgIDgd9J+khEND1UtCPGwL5l1DQT8L6Pv1n3lauB3MnApoh47TDznAvcGxHvRMQrwEbg1Bxt3wpg1pTh/E3P/2Jlz6vZfPTfsrLn1fxNz//yffzNurFchf6FwD1Z378iaZ2k2yT1S2qDgC1Z81QnNTtCzSj5T24svZWKo3ZwlKDiqB3cWHorM0r+s9BNM7MWdDr0JfUEpgP/npRuBv6cTNfPNuBHHVjnFZKqJFXV1tZ2tomWL8vn0aNhb5NSj4a9XXYlsE8XNWu/XBzpTwNWR8TrABHxekQ0RMQB4N94rwunBhictVxFUnufiFgYEZURUVleXp6DJlpeFPBK4MbTRWt21RO8d7qog9/s8HIR+heR1bUjaUDWtPOA55LPDwIXSjpa0lBgGPDHHGzfCqWAVwIf7nRRM2tZp0Jf0geAvwaWZJV/IGm9pHXAx4G/B4iI54HFwAvAb4CrfObOEa6AVwJv3VXP9KNWNhlEnn7USp8uataKTl2cFRH/Cxx/SO1zh5n/u8B3O7NN60YKdCUwwCXH/JHr9t1Kb70LQIUyg8gfLO0JfDLv2zc7UvmKXOucAlwJDHBd6SJ673+3Sa233uW60kXA/8vrtu9fU8P8ZRvYuquegX3LmDVluK9AtiOGQ9+OSL3r/9Sueq7cv6aGlUt/yiLuZeDRO9i65wT+aemFwJfzHvz+sbFccOjbkalPReYJYc3V82jtwwuZp4VNupXmxUJ+8HAPZozL378wCvlj07h9/+AUB99a2Y5MBRpEvuzdXx4M/Ea99S6XvfvLvG638ccm+0K4eVrI2ocX5nW74NNji42P9O3IVKBB5IFH7WxXPVcue/eX9D6qpR+b/I5hzF+2gb9ueJzrei5moHawNU7gB/tnMn9ZT3dpHYEc+nbkKsAg8t6yE+ldv635eh63W6gfG4DKtx7le6XvP1NqzlsAf5W37Ra6S+uZB/+Vwavn86GoZbvK2XLKLCZM/1Let5tv7t4xa4fe0+axv6RXk9r+kl70npbfW0/sLTuxXfVcmtPz35vt0prT899bWCI3Ctml9cyD/8qoVd/kRGo5SnAitYxa9U2eefBf877tfN9exKFv1h5jZtLj3H+BPoMBQZ/Bme95/hdHoX5sAPqzo131XCnU+AnA4NXzKTtk22V6l8Gr5+d1u10xfuLuHbP2KsS1CWNmZv6yZo1h9OiiC+HUwplSyvOZUoXs0vpQ1IKaq+f3h64rnkbn0Dc7UhToQjgmfxseuhr2Zd3iogvOlCrU+AnAdpVzIu+/w+92nUA+O9S64ml07t4xs8MbMxPOWdCkS4tzFhR1l9aWU2ZRHz2b1OqjJ1tOmZXX7bb01LlcPo3OR/pm1rqUdWlNmP4lnoHk7J0dbNcJbBmf/7N3Zk0Zzpwl65t08ZSVluT0aXSKiJytLB8qKyujqqqq0M0wM+sSubg2QdKqiKhsbpqP9M3MupEZ4wbl9ToE9+mbmaWIQ9/MLEUc+mZmKeLQNzNLEYe+mVmKdPtTNiXVAq91cPETIM83COl+vM/FL237C97n9vpwRJQ3N6Hbh35nSKpq6VzVYuV9Ln5p21/wPueSu3fMzFLEoW9mliLFHvr5f9pC9+N9Ln5p21/wPudMUffpm5lZU8V+pG9mZlmKMvQlTZW0QdJGSbML3Z58kzRY0gpJL0h6XtI1hW5TV5FUImmNpP8odFu6gqS+ku6T9JKkFyX9n0K3Kd8k/X3y//Vzku6R1Kv1pY4skm6TtF3Sc1m1D0p6VNLLyXu/XGyr6EJfUgnwE2AaMAK4SNKIwrYq7/YD/xARI4CJwFUp2OdG1wAvFroRXeifgd9ExEeBj1Hk+y5pEHA1UBkRo4AS4MLCtiovfg5MPaQ2G1geEcOA5cn3Tiu60AdOBTZGxOaIeBe4Fzi3wG3Kq4jYFhGrk8+7yQRB/u7N2k1IqgA+Cdxa6LZ0BUl9gNOBnwFExLsRsauwreoSPYAyST2A3sDWArcn5yLiCeCNQ8rnAnckn+8AZuRiW8UY+oOA7Kc4V5OCAGwkaQgwDvhDYVvSJf4JuA44UOiGdJGhQC1we9KldaukDxS6UfkUETXAD4H/AbYBdRHx28K2qsv0j4jGhwT/Ceifi5UWY+inlqRjgF8B10bEW4VuTz5J+hSwPSJWFbotXagHcApwc0SMA/6XHP2Tv7tK+rHPJfODNxD4gKTPFrZVXS8yp1nm5FTLYgz9GmBw1veKpFbUJJWSCfy7ImJJodvTBSYB0yW9SqYL768k/bKwTcq7aqA6Ihr/FXcfmR+BYvYJ4JWIqI2IfcAS4C8L3Kau8rqkAQDJ+/ZcrLQYQ/8ZYJikoZJ6khn0ebDAbcorSSLTz/tiRPy40O3pChExJyIqImIImf/Gv4+Ioj4CjIg/AVskNT4lezLwQgGb1BX+B5goqXfy//lkinzwOsuDwCXJ50uAB3Kx0qJ7Rm5E7Jf0FWAZmZH+2yLi+QI3K98mAZ8D1ktam9Suj4hHCtgmy4+vAnclBzSbgS8UuD15FRF/kHQfsJrMWWprKMKrcyXdA5wJnCCpGrgBuBFYLOmLZO40PDMn2/IVuWZm6VGM3TtmZtYCh76ZWYo49M3MUsShb2aWIg59M7MUceibmaWIQ9/MLEUc+mZmKfL/AY+Z+wpQpxosAAAAAElFTkSuQmCC",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "f, ax = plt.subplots()\n",
        "ax.scatter(range(len(losses)), losses, label='train loss')\n",
        "ax.scatter(range(len(val_losses)), val_losses, label='val loss')\n",
        "plt.legend(loc='upper right');"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9k-x3QVMOVNr"
      },
      "source": [
        "The normalizing flow is learning a mapping between the multivariate Gaussian and the target distribution! We can see this by visualizing the loss on the validation set. We can now use `nfm.flow.sample()` to generate new QM9-like molecules and `nfm.flow.log_prob()` to evaluate the likelihood that a molecule was drawn from the underlying distribution."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "metadata": {
        "id": "mW8DeYFmOrJh"
      },
      "outputs": [],
      "source": [
        "generated_samples = nfm.flow.sample(10)  # generative modeling\n",
        "log_probs = nfm.flow.log_prob(generated_samples)  # probability density estimation"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "s0M2xaqcdYEc"
      },
      "source": [
        "Now we transform the generated samples back into SELFIES. We have to quantize the outputs and add padding characters to any one-hot encoding vector that has all zeros."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "metadata": {
        "id": "DVVQ-dwWdXWb"
      },
      "outputs": [],
      "source": [
        "mols = tf.math.floor(generated_samples)  # quantize data\n",
        "mols = tf.clip_by_value(mols, 0, 1)  # Set negative values to 0 and values > 1 to 1\n",
        "mols_list = mols.numpy().tolist()\n",
        "\n",
        "# Add padding characters if needed\n",
        "for mol in mols_list:\n",
        "  for i in range(largest_selfie_len):\n",
        "    row = mol[len(selfies_alphabet) * i: len(selfies_alphabet) * (i + 1)]\n",
        "    if all(elem == 0 for elem in row):\n",
        "      mol[len(selfies_alphabet) * (i+1) - 1] = 1"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tpwHYMP0LAvS"
      },
      "source": [
        "`selfies` has another utility function to translate one-hot encoded representations back to SELFIES strings."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "metadata": {
        "id": "2XV-ZTgFjP04"
      },
      "outputs": [],
      "source": [
        "mols=sf.batch_flat_hot_to_selfies(mols_list, int_mol)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hoC6RD8fdvVA"
      },
      "source": [
        "We can use RDKit to find valid generated molecules. Some have unphysical valencies and should be discarded. If you've ever tried to generate valid SMILES strings, you'll notice right away that this model is doing much better than we would expect! Using SELFIES, 90\\% of the generated molecules are valid, even though our normalizing flow architecture doesn't know any rules that govern chemical validity."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "F7EVnH9SdyN7",
        "outputId": "da805d15-1280-4766-bc1a-36b12dd0ae68"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "1.00 % of generated samples are valid molecules.\n"
          ]
        }
      ],
      "source": [
        "from rdkit import RDLogger  \n",
        "from rdkit import Chem\n",
        "RDLogger.DisableLog('rdApp.*')  # suppress error messages\n",
        "\n",
        "valid_count = 0\n",
        "valid_selfies, invalid_selfies = [], []\n",
        "for idx, selfies in enumerate(mols):\n",
        "  try:\n",
        "    if Chem.MolFromSmiles(sf.decoder(mols[idx]), sanitize=True) is not None:\n",
        "        valid_count += 1\n",
        "        valid_selfies.append(selfies)\n",
        "    else:\n",
        "      invalid_selfies.append(selfies)\n",
        "  except Exception:\n",
        "    pass\n",
        "print('%.2f' % (valid_count / len(mols)),  '% of generated samples are valid molecules.')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pyt6ta2-d5Rd"
      },
      "source": [
        "Let's take a look at some of the generated molecules! We'll borrow some helper functions from the [Modeling Solubility](https://github.com/deepchem/deepchem/blob/master/examples/tutorials/03_Modeling_Solubility.ipynb) tutorial to display molecules with RDKit."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 25,
      "metadata": {
        "id": "XyE4CuaRe7BL"
      },
      "outputs": [],
      "source": [
        "gen_mols = [Chem.MolFromSmiles(sf.decoder(vs)) for vs in valid_selfies]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 26,
      "metadata": {
        "id": "JehQTBLXd9Gn"
      },
      "outputs": [],
      "source": [
        "def display_images(filenames):\n",
        "    \"\"\"Helper to pretty-print images.\"\"\"\n",
        "    for file in filenames:\n",
        "      display(Image(file))\n",
        "\n",
        "def mols_to_pngs(mols, basename=\"generated_mol\"):\n",
        "    \"\"\"Helper to write RDKit mols to png files.\"\"\"\n",
        "    filenames = []\n",
        "    for i, mol in enumerate(mols):\n",
        "        filename = \"%s%d.png\" % (basename, i)\n",
        "        Draw.MolToFile(mol, filename)\n",
        "        filenames.append(filename)\n",
        "    return filenames"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 27,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "oyWxxxqvnKGf",
        "outputId": "703eabbc-9073-43dd-f70d-b136aaee422a"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAIAAAD2HxkiAAAABmJLR0QA/wD/AP+gvaeTAAAXn0lEQVR4nO3de1hUBf7H8c9wFUS8pIDiFTM384au5noDE1ELKxNBTbNtix6f1VWr3bylmW2rlpc1865ZeSl8HkwLbxkq6qqluesSsAa6LlqugBdEufP9/TH+WBzHAYQ53xn9vB7/qJnDOV/Lt2fmXGZMIgIi0uOiPQDRg44REiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREiljhETKGCGRMkZIpIwREilz0x6AHE5uLnbuBIDevdG4seWzcXEoLUVkJC5dQkICAgIQGmplJXv3IisL4eFo0MDe8zo9k4hoz0COJT0dDz8MAIMG3aqxPG9vFBWhqAgJCejfH2Fh+OYbKyvp2RNHjuDYMXTvbveBnR1fjtJd7dqFuDjtIR4AjJCsCwqClxcmTsT169qj3O8YIVnXuDEmTcL585g5U3uU+x0jpLuaNg1NmuDDD/HDD9qj3Nd4dNRRiEhJSUk1V2IyuVXzQJtLub+WfXzwl79g7FiMG4cjR257qkxBATIyrDxeWFitMR4sQo7hiy++qP7/zSZNzgFSnV8TJkhamgDSq5eISGmphIQIIB99dGtOLy9xcxMR+fbbitd27Jjaf08nwj2ho3BxcXF1da3mSlxdTdVch8WPm0xYsgRdu2LaNAwbBn9/y+VbtMDw4VbWs2kTfv65WpM8OBiho4iMjCwuLtaeAgDS02/7144dMWECFi3CjBlYvdpy4TZt8P77VlZy+DAjrCwemKGKzZ6N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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAIAAAD2HxkiAAAABmJLR0QA/wD/AP+gvaeTAAAWAElEQVR4nO3de1SUdR7H8Q9XRQRREK/gFdE0W9QW17xgWrZGeU577OIeMjsbZrrjSSvqtDZmp21qt2Rrt8TdLdFjF3c7taDWSkZaauZlNRVBIAzEG+EVL9zmu3/McJlJmRmYmS/I53X8Qx7mmflxec/zey4z+IgIiEiPr/YAiNo7RkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOERMoYIZEyRkikjBESKWOEbU9hIebOxfLlNgvz8jB3LgoLkZWF2bNRUWG/yuzZ+P5764dPPolLl7w0WnKIEbY9p05h5UosXoyvvmpYePw4Vq7EqVPIycHq1bh61WaV06exejWOHbN+mJ2N6mqvjZccYIRtVf/+WLDA5Zb++EfMmYOSEsyfjzlz7DeYpMJfewDUTEuX4rHH8PrrePZZF9aaMwdXr2LnTqSkICQEnTp5bHzkNG4J26qYGBgMWLYMP/zgwlq9emHAAAQGIjoaAwbAlz//VoA/hDZsyRJ07QqD4RqfGjkSffs2/Jsxw+aza9ciJMT6/wMHDowdO/bEiRMeHy5dB6ejbVhoKF5/HQ89hE8/RZcuNp96/nl07tzwYWEhXnqp4cPhwxv+HxQU1Ldv38DAQA8Plq6LEbZtDz6If/wDixfjb3+zWf7AA4iI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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAIAAAD2HxkiAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3deVxU9foH8M/MsMqOKIoKCuKCWiru+wJpBno1UVrQTB1Lk+vVe8V77f7QuhVkC1maoFloWUIoqeWCWypqipKpiSsqAiIg+zrDPL8/ZhLBEQFn5szyvF/+wXzPMs8gn/me8z2biIjAGBOOWOgCGDN1HELGBMYhZExgHELGBMYhZExgHELGBMYhZExgHELGBMYhZExgHELGBMYhZExgHELGBMYhZLpz5w7270dqav327Gzs34+cHNXLjAz8+quOSxMSh5Dpzo4d8PfH4MG4fLlO+7598PevDd7p04iK0n11guEQMl2rqsLChU1bJCEh4c6dO9opR3gcQqZrEyciKQnff69mUng4vLwwfz6SkuDlBS8vECE9PX3q1KnvvfeezivVEQ4h07U330Tnzli8GIWF9SetXInr17F2Lfz9cf06rl+HSIROnTolJCQsX75ciGJ1gUPIdM3CAp98grt30fhYTZkypX379tosSkgcQiaAwEBMmIB16/Dbb2qmDh2K//u/2pf37t1r27btv/71L52Vp2McQiaM1athYYE330RNTf1Jrq7o06f2ZV5eXk5OztmzZ3VZni6ZCV0AM1FeXli2DCtWYMMGWFk1NKePj09lZaWFhYWuStM17gmZYMLC0Lkz/vtfFBc/Yc7CwsKaR3tMY8EhZLpAhIqK+o1WVvj8c+Tm4tNPG1o2KyurQ4cOy5Yt0155wuIQMq0rKUFQEKZPx6P3uB0/HlOmID29ocVdXFzmzJkzYcIE7VUoLN4nZNp14QKmTMHVq3ByQt++amaIisK+fSgtfewaLCws1qxZo70KBcchZFr0ww+YMwdlZXj2WSQkIDcXlZXw8KgzT4cOiI3FqVPo1k2gKoUm4tvgM22Qy/H224iMBIBXXkFMDFq0ELomfcU9IdO83FwEB+PgQZiZ4X//Q1iY0AXpNw4h07DkZAQFITsb7dohPh6DBwtdkN7j0VH9cvDgwX379i1YsODcuXNC19IcMTEYMwbZ2RgxAikpnMDGIaYfFApFRESERCJxdnZW/tf4+vpGR0eXlpYKXVqjVFTQa68RQABJpVRdLXRBhoNDqBeKi4unTp0KQCQSzZkzZ+HChY6OjsooOjo6Lly48MKFC0LX2JCrV6lXLwLI1pa2bhW6GkPDIRReWlqaj48PAHt7+4SEBGVjZWVlXFycn5/fg20WZcdYVlYmbLWP2rWLnJwIoC5d6Px5oasxQBxCgSUmJjo4OADo1q3bn3/++egMly5dCgsLe7CN6uDgIJVK//jjD92X+iiFgiIiSCwmgCZOpMJCoQsyTBxCwchksrCwMJFIBOCll15qeN+voqJCbcdYXl6us4LrycujceMIIImEwsNJoRCqEIPHIRTGvXv3xo4dC8DMzCwiIqLxC168eDEsLMzJyenBHqNUKtX9HuPZs9SpEwHk4kL79un4zY0Nh1AAp0+fdnd3B+Dm5nbs2LFmrKG4uHjdunV9/rr0VSQSTZgQEBen0M2Y5KZN1KIFAeTrS+npunhH48Yh1LXo6Gjl9anDhg3Lysp6yrWlpKRIpVJbW9uhQ2cA5OpKYWF0/bpGKlWjspJCQ2uPQ1RVaeuNTAqHUHcqKipef/11Zd8llUqrNddtFRYWbthw55lnVPEQi2ncONq2jWSypq2nsrJywYIFv/76q9qpVVU0cCABZG1NX3/99FUzFQ6hjty6datfv34AbG1tf/jhBy29S0oKSaVkY6NKY5s2FBZGN240dvGMjAxzc/OlS5c+bob//pc6dKBTpzRTLVPiEOrCzz//rBxK8fb2Pq/9Q2mFhRQdTQ93jH5+FBenvmMsLqa4OEpIUA1v5uTkyGQyIiovp7g4SklRzVZdTbGxVFNDBQXaLt/kcAi1S3kymlgsBhAYGFig2z9hZceoHEQByM2NwsLo5s0686SlqaauX1+nPSODAJo3T/WysJDs7HRUtqnhEGpRfn7++PHjAUgkkvDw8JqaGkHKKCig6Gjq2VN9x6gMoUhEzs50717tUg+HUNkB2tlRTQ0J9CGMGYdQW1JTUz09PQG0bNly7969QpdDCgUdPEjTp5OFhSqNHTvSe+/RxYsE0JQpZGZGM2fWzv8ghHv2UOfO5OlJYjF17kydO1Ozjqqwx+IQasXmzZtbtGgBoG/fvul6dijt/n2KjiYfHwJowABVT7h8Oc2ZQyIRHTqkmo03R3WGryfUsKqqqr///e8hISHl5eUhISHHjh3r2LGj0EXV4eQEqRTnz2PfPnzwQW37e+/BwQHz5qGqSrjiTBKHUJMyMzNHjRq1evVqS0vLmJiYTZs2WVtbC12UemIx/P0xZkxtS+vWWLkSV65g1So189va4uefdVadaeEQasyRI0f69et38uTJDh06HDlyZO7cuUJX1GQLFqB3b7z/Pm7cqD9JIsHw4ULUZAI4hBpARJ999pmfn9/du3dHjx6dkpIyYMAAoYtqDokEMTGoqoLxPgFJH3EINSA0NHTRokVyufztt99OSkpq3bq10BU1X//+mDUL27bh8GGhSzEZHEINeP31111dXX/88cd3331XIpEIXc7TiohAy5ZNeIIne0p8y8MnKy0tPXHixN27d+3s7Pr06eNR9w7SsbGx48ePv3HjRgtjubutiwvefx/z5gldh8ngnrAh1dXVS5YscXFxee6552bMmDF58uSOHTtOmTIlPz//wTyffvppZmam0SRQac4cvluh7nAIH4uIpk6d+sknn/Tv33/nzp3Xr1///fff//3vf+/atWvlypVElJeXl5eXV1NTU1hYmJeXV15eLnTJzeHsjLCw+iOfYjFiYhAWhnHjBCrLlPCzKB5r69atwcHBI0eO3Ldv38OPif3tt9/69u1bUVHh7+8P4MKFC56eni1atJg1a9Ybb7whXL2akZeHdetQU4PwcKFLMRkcwsd6/vnn9+zZc/LkyYEDBzYwW+/evTdu3NhX7VO/DFB2Ntzc0KoV7t0TuhSTwZujj3Xy5ElLS0sDPeLXbG3bws4OubkoKhK6FJPBIVSvqqqqsLCwQ4cOylsSNiA+Pl55616j4ekJANeuCV2HyeAQqshkspMnTz78EoCVldUTF/T29m7MbAakc2eAQ6hDHEIAyMrKGj169OjRo8+cOaNssbGxsbCwyMjIELYwQXAIdYxDiCNHjvj6+iYnJ7dq1UqhUCgbRSJRz549i4qKMjMzhS1P9ziEOmbqIYyJiVGeeD1y5MhTp07179//waS//e1vANauXStcdcLgEOqaoJcUC6mkpGT69OkARCJRaGjoo3cBzc/Pd3NzMzMzW7NmzYPbw8hksu3bt+fm5uq8Xt1RXlPfpo3QdZgMEw3hlStXevbsCcDOzi4+Pv5xs509e7Z9+/YA2rZt+/zzz48aNaply5YAoqOjdVmtjikUqhu0FRcLXYppMMWD9Tt37pwxY0ZhYWHXrl0TEhJ69OjRwMzl5eWbN2/+9ddfc3JyHBwcPDw8Ro0aFRAQYARXSzSgVy9cuIDUVPTuLXQppkDobwGdksvl4eHhyruATpo0qbDBB+rl5ubq4RM5deNvfyOA4uKErsM0mNDATF5e3oQJE1auXCkWiyMiIrZv3658OqdaZ8+eHTBggCHeokIjvL0BHpvRFZO5nvD06bnz5+9LSXF1dd26devIkSMbmHfDhg1vvfVWVVVVmzZtSktLbW1tdVamnvDyAoDr14WuwzSYRk+4aRNGjtxcXu4/YsSZM2caSGBVVZVUKp07d67yh8OHD5tgAsFHKXRM6O1hLauspDlzGvlAvdu3bysvmLCysvrqq690VqMeunlT9ewKpgNGHcLbt2nAAALIyoqeFKpDhw4pb9Dk7u5+yuSf/VVTQ1ZWJBJRaanQpZgA490cPXQI/frh1Cm4u+PoUfz1dM5HEVFkZKSfn9+9e/cmTJjw+++/P3zejGkSi+HpCSLeLdQFYwwhESIj4e+Pe/cwYQJ+/x39+j1u3pKSkqCgoGXLlikUirCwsJ07dyofJMh4t1BnjG50tLhYdd9MkQhhYXj/fYgf+0WTlpY2ZcqUS5cu2dvbx8bGKk8WZUocQp0xrhCmpWHKFFy6BGdnfPcdxo9vYN6r27f3CwkpKyvr3bt3QkKC8jFm7AE+SqEzRrQ5+v336NcPly6hd2+cPt1QAuVyLFvm/eKL/+3Z85VXXklOTuYEPkrZE169KnQdJsBYzh09dw59+oAIr72GtWvRwLOQsrMxbRqOHYOFhfzzz82kUh1WaUjS0+HpiQ4dcPu20KUYO2MJIYD//hft2qHhmw4eO4Zp05CdjXbtEB/PN7htQE0NWrSATIaysoa+09jTM6IQPlFMDN56CzIZRozA1q1o00bogvRdt264fBkXLqDB60zY0zLMgRm5HKdP49o1yGRo2xbDhsHOrqH5Kyowfz6++QYiEUJD8dFHMDfXVa0GrHNnXL6Ma9c4hNplgCHctg2LFuHhWzBZW2PRIrzzDszUfZyrV/Hiizh/Hra22LgRQUE6q9TQ8VEK3TC00dGtWxEUBHNzbNmC7Gzk5eHwYQwdig8+wKxZaubftQsDBuD8eXTpgpMnOYFNwiHUEWHPmmua4mJycqJWrSgrq067TEb+/gTQ7t21jXI5hYeTWEwATZxIDV6/y9TavZsA8vMTug5jZ1A94Y8/oqAAixahbds67WZmiIwEgPXraxsXL8bKlRCLsWoVEhPx+Ot32eNwT6gbBrVPePw4APj5qZnUpw9atVLNoLR4Mfbtw+efq5+fNULHjliyBF26CF2HsTOoEGZlAUCHDuqnurvj7FnI5arhGQ8PXLzYwImjrAHbtyM3F2PG4KOP6rTv3Im8PPV736zZDOpvtKYGAB53mzMzMxDhr1toA+AENpvycdkvv1zn1wng448RGipQTcbLoP5MW7YEgNxc9VPv3YO9PR56mid7GmIxTp+us5fNtMSgQtinDwCcOqVm0t27uHlTNQPTBHd3DB2KsDBkZwtdirEzqBC++CLEYnz5Zf2NJABffAEiTJ8uRFlG66OPUFyMf/1L/dSMDCxbxtc6aYBBhbBTJ7z5Jk6fxpw5KC1VNRJhwwZERsLHh0cMNGvQIISE4LvvcOCAmqnK37q3N/z9ER8PmUzn9RkNoQ9UNlFlJQUHE0D29uTvT4GB5OFBAPXoQTduCF2c8ejXjzp2JCK6e5ccHcnbmyoqiIhGjiRbW9U8Z87QrFmqp1YoHyDzn/9QerpQJRswg+oJAVha4vvvcegQQkIAoKgIw4cjNhapqejUSejijJCrK1auxNWrWLWq/qS+fbFxI7KzER2NZ5/F3bt4/314eXHH2GSmdCkTa7T+/ZGXh/R0AKipQf/+SEvDpUuYORNnzqCkRM0iZ84gJgbffovycgBo2xYzZuCNN9Cxoy4LN0iG1hMynZNIsGYNqqqwfHlDs/n6IjoaWVmIjkavXsjORmRkbccol+uqXAPEPSFT4+GeUGnuXGzciFatUFamviesR9kxbt6MigoAcHNDSAjefBMeHtqq2XBxCJkaj4bw/n107Yq8PNjaNiqESoWFiIvD55/jwgUAEIsxZgykUkyZ8tgTn0wQb46yRnF2xvvvAwARKisbu5SjI6RSnD+PlBRIpbC0xP79mDYNHh5YtqzOhdmmjHtCpkZsLCoq6t80S6HA559j7Vrk5GD6dLz1Fnr1atpqc3LwzTdYv151iF8iwejRCA1FQABEIo0Vb3A4hKwJKisxahR++w0ARCKMHKnatrS0bMJKFAocPIiYGCQmqo5kdO6MOXMwaxZat9ZK2XqOQ8ia7M8/sWkTYmJQUAAAjo6YNg2hoU2+H9Tdu4iNRXS0aufTwgKTJkEqxdixptUxcghZM5WU4PvvER2Ns2dVLb6+CA1FcHDTLmVRKLBnD2JisGuX6mK1rl1x7BhcXDRfs37iELKnpTwasWWL6nxeV1e89hqkUjT12QLZ2di0CevWQSxGWBgGDEDv3nVmOHAA169j1izVDSt37UK7dkZx5YxwZ8wxo1JURNHR1Lu36lRSsZj8/Cgujqqrm7YeuZz8/AggD4/6jyidPp0AKilRvZw9m6KjNVO8sPgQBdMMe3tIpUhNVR2NsLZWHY1wd8eyZXUOOTZMIoG1NUQi3L6tOijyqJwcZGaivByFhcjMRH6+pj6EQIT+FmDGqbCQoqPpmWfqd4wy2ZOXDQwkKyuaPp0sLOjixdr2Bz3htGk0fDi1aUPe3jR8OC1Zor3PoQscQqZdKSkkldZe8eTmRmFhdPNmQ4soQ3j9OllZ0ciRpFCo2hveHD1//vyLL76YkZGhnc+hRbw5yrRLeWJ3Ziaio9GzJ7KyEBkJT88nn9jt6YklS/Drr4iNbdQbXbhwYdu2bemN3/DVGzw6ynSq3ond7drh1VexYEGdG1lOnIikJFRUoLwcPXqgpARpaXBxQXAwtm5FSQlsbQEgJwdWVnXu6lxWVmZjY6PbD6QB3BMynVJ2jDdvqi50ysxU/TB1Kg4frj9zixb45BPk5+M//1GzKldXI7mvOoeQCaB1ayxdiqtXkZSkekhPQgLi49XMOXkyAgLw1Vc4ffoJ69y6dau9vf3Ro0c1X66WcQiZYEQi+PkhLg63b+O99zB/vvrZPvsMlpb45z/R8J6Tj4/PpEmTOhrglfy8T8j0zoN9wgfeeQfh4WjdGvfu1e4TGg3uCZkBCAtD1664d0/oOrSDQ8gMgKUlVq8WugitMainMjHTsGABJk2q3/jcc/jhBxQVNe3aRYPA+4SMCYw3RxkTGIdQz6QfwI39atpz/8TlHagq0nlBTOs4hHpmpxQ7ZqtpT92IHybhPj8DyQhxCBkTGIeQMYFxCBkTGIeQMYHxwXr9U5KFNd3rN5YZ6SlbjEOojySW6DCkfmPmKVTcF6IapnUcQv3ToiUmflW/cd8/ce+CENUwreN9QsYExiFkTGAcQsYExiFkTGA8MKNn+s4F1ahp7zgKAGxddVsN0wW+nlD/3P1dlUORGHbtYGOSD840JRxC/RPphMrC2pcWdnjmVfh/CAvjur0R+wtvjuolZ2+8sBYASrLwx2akfImSLAQnCl0W0woOoV6ytIOnn+rnZ15BdF9c/glFt+DgIWhZTCt4dFTviSSqs9gKbwpcCdMODqEhyL8KADY8NGqceHNULynkqCwAgIr7SP0a6QfQ1hctuwpdFtMKDqFeyvkDkc61L9v6Ylo8RCLhCmJaxCHUG9UlyEuDW38AcHDH8OUAYNMKzt5o3VPY0phWcQj1QMF1nFmPs+shkuAftwGghQt8pUKXxXSEB2aEQwpc/QXfPY/PuyA5EhX30ar7E66gL7iBW0d0VZ92ffQRpk3Dpk3127/4AtOmobQUhw8jOBjJyfVnKCtDcDCiompbJkxAjbpT/QwFh1AIVcU4E4Mve2HLC7i2B2JzPBOCeal47Vc4uD92KYUM215B7BgcXgFS6LBcrThxAvHxePNN3LxZp/3UKcTHo7oa169j69b6UwFUVWHrVhw7Vtuydy8Uhvz74M1R3cq/gtNrkLoR1aUAYOeGvnMx4C20cHnysiIxvMYh8xR+XYnbRzHlO9i20Xa9WiUSQSTCokVIbNa5QLm5OHgQAIgQHw+JBEOGoEMHzdaoCxxCnSAF0g/it89w5WeAAKDDUAz6O7pNhviR/4Juf1N/0rZIglEr4DEcCa8g/SBi+mHqD3AfpvXitUYkwpIleOcd7NiBiRObvHhpKc6dU/38xx8Qi9G9u0GGEMS0qrKQTkZRVCdaAVoB+p8VbQuhnD+eap1FGbRxGK0AvWNGh8JJUaOhWrXr+nVasoSuXlW9nDKFxGIqKyN3d3J3p5ISVXtICAGUn08bNhBA335bfz35+QTQiy/WtojFVF2t/Q+gNdwTak1eGlK+xNmvICsDACcv+M5F37mwdn7Skk9i3x4zD+HI/3DkXfy6EhnJmPKtPp9Pc+wYVq/G9u2Qy6FQ4JNPaie1aIH338err2LlSqxapWbZW7eQmlqnpbi4/jytWtU5hlpRUSGTyezt7TVVv9YJ/S1gbGQyWVxc3P5PZqi6vpVi+nY8XflZK/3V9SRa5UorQJ+0p9vHNL/+p1NcTF98Qd26EUAAWVrSzJl05oxqqrInJCKFgkaPJjMzSk0leqQnfNy/h3vCesaMGdOxY0ftfz6N4Z5QY+7du/f111+vXbv29u3bQ3x7jX3RDr1ewsC/o5WPtt7S0w/SFPwYjIxkfDMKw5dj5P9BJPyI97Vr2LABMTEoKACAtm0hlWLBArRqpWZmkQiff44+fbBwIY48cvzl3//G2LF1WkpKMHlyQ+8eHByck5PzNPXrmtDfAsbg9OnTM2bMsPzrOc7du3dfs2aNoqrkyUtqRI2MDoXTSjGtAG0JoPI8Hb3vo4XUUFISBQWRRKLqr3x9KTZW/Q7bg55Q6Z//JIC+/745+4SGjkPYfFVVVXFxcX5+qgv/xGKxn5/fjh07FAqFANVc3kmRzrQC9EkH3W+aFhVRdDR171675RkSQr//3tAi9UJYUkLt25OHBwUFmVwIeXO0OXJycr755psvvvjizp07ABwcHGbOnLlo0aJOnToJVlOXALzxO34MRsZxXW6aXrmCNWuwcSNKSwHAzQ1z52LhQrRs2bT12Nri008RFATD2pDUDKG/BQxMSkqKVCq1srJS/va6du0aFRVVWloqdF1/qbNpGkjl+Vp6H7lc/tNPVWPGkEhEAIlE5OdHiYlU0+jhp3o9odKECaq+1KR6Qg5hoyi3PIcMUT2nRSwWBwQEJCUlCbPl+URpiRThRO+Y/2em38mTJzW77sLCwqioqI4dO44YsRogW1uSSun8+aatpLycRo9WE8KrV8nKikPI6srKygoPD2/117ieo6NjaGjozZs3ha7rSQrSf44MAWBhYfHpp59q5MsiNTV19uzZ1tbWyl/FqFEvREVRYWHTVpKZSeHh5OJCDg50TN2u6+XLlJJCMhnl5dGZM3T/fv0Z5HI6c4Zu3Gjmp9BDHMIn6Nu3r/Jvrm/fvl9//XVFRYXQFTWWTCYLCwsTiUQAJk6cmJ/fzE3TmpqaHTt21Bt/iouLk8vljV+JQkEHDtDkybUDp/371549Y+I4hE/w9ddfBwcHJycnC11IM/30009OTk4A3N3djx8/3qRlc3JyIiIi3N1VF3bY29tLpdKLFy82aSUVFRQbS716qbJnYUFBQZSU1KR1GDkOofG7devW4MGDAZiZmUVERDRm01Q5/vRgy9Pb2zsiIqKgoKBJ73vtGoWFkbOzKn5t2lBYGGVkNPdjGC8OoUl4eNN00qRJ9x/d0yIiDR35VCiacMieEYfQpCQmJj7YND1x4sTDk7KzsyMiItq3b6+Mn4ODQ2ho6I0mjn4UF1N0NPXoUXvIPiiImrgJbIo4hKbl1q1bgwYNAmBubv5g03TVqlXm5ubK+D377LPr168vKytr0mqvXKGwMHJyUsWvbVsKD6fcXO18BqPDITQ5lZWVoaGhD2+a7t69u3lHPpUDp8HBc8VihTJ+o0dTQgI1ZdyUcQhN1fbt25Wbph4eHsePH79z506TFi8qKoqOju7WrZuy/xw8+OC8eU0+ZM+UOISm6+bNmwMHDgRgaWkZFRXVyKXS0tJCQ0NtbGyU8fP09IyIiMjLE+zSDSPAITRplZWV8+fPV8bppZdeamDOB4fsRX9dxD506NCmHrJnanEIGW3bts3R0TEiIkLt1IKCgqioKA8P1VPZ7OzspFLphQsXdFykEeMn9TIAyMjIaN++vaju4y5SU1PXrVv37bfflpeXA+jcufOcOXOkUqlyZ5JpCoeQ1SeTyRITE2NiYvbv3w9ALBaPGTMmNDQ0ICBAxA+l0QK+qJfVqqioWLVq1bp167KzswE4Ojq+/vrr8+fP9/LyEro0Y8Y9IaulUCi8vb1v3LjRpUuX+fPnz5kz58EoKNMeDiGrY8eOHXZ2dqNHjxa6EBPCIWRMYMLfo5IxE8chZExgHELGBMYhZExgHELGBMYhZExgHELGBMYhZExgHELGBMYhZExgHELGBMYhZExgHELGBMYhZExgHELGBMYhZExgHELGBMY3enoquTLZF5mZj7aPdXIa4eCg+3qYIeIQPpWSmpqf8/PtJRLnv55qpPQs3x+JNRqHUANeaNlySYcOQlfBDBXvEzImMA4hYwLjzVENyJHJTpeUPHjZQizuwfuErNE4hBpwsKDgYEHBg5de1tZbfXwErIcZFg6hBvg7OQW3bv3gpbVYDOB8WdmlsrKRjo6uFhbClcYMAIdQA1zMzZ+1ta3X+FNeXmJe3ocZGZ5WVn5OTsMdHbu3aCFIeUzPcQi1ZbiDQ2lNzfGiohuVlTHZ2THZ2e0tLUc5Oo5ydHzGxkbMzxhjf+EQastIR8eRjo7VCsXvpaVHiooOFBTcqar6Nifn25wcBzOzoQ4OIxwchjg4tBDzALWp4wfCPJUblZXTLl58qXXrJx6sVwCXy8uPFhYmFRSkV1YqGy3F4gF2dsMdHUc5Ojqb8ReiieIQPpXGh7DOUhUVh4uKDhcWXiorU/72JSLRIBsH7ySvSZPA596YGg7hU6lSKC5XVLiYm7s1awi0QC4/XlS0v6DgZHGxV6njdyM9Afj4ICgIgYHw9X3yGoqKoFDA3h4SSf12kQj29iguRkUFXFzqz1BdjYIC2NmBR4uER0wPFMvlO45XBQWRrS0Bqn9eXrRkCR09SnL5Yxd0cyOAVqyo3+7tTV27EhHNnk0AXbtWf4Zduwigjz7S6MdgzcKjAnrBTiIJHGwRF4e8PCQlITQUbm64fh0ff4zhw+HqihkzEB+PsjL1i3/wAS5f1m3FTHM4hPrF0hJ+fvjsM2RkICUF4eHo3h35+di8GdOmoVUrBAYiJgb37tUu0qULLCzw1lvCFc2eDodQT4nF8PXFihX4809cuID//Q/9+qGyErt2Yd48tG8Pf252vOcAAA3CSURBVH9kZQFAq1ZYuhT792PLFqGLZs3CITQAPXpg+XKcPo27dxEbi4AAiERISUGrVqoZ/vlPdOyIxYvx0BmszGDwsSlD0ro1ZszAjBkoKMCff+LB1fxWVvj4Y7z4IpYvx9q1ahZcuhR2dnVa7tzRerWskTiEBsnJCUOH1mmZMgXjxyM6GjNnYuDA+vNfuIB6x1AeuvSKCYxDaDy++AI9e2L+fJw+XX/SL7/Ay6tOy88/IyBAZ6WxhvA+ofHw8kJYGM6exbffCl0KawoOoVFZtgxeXli+HBUVQpfCGo1DaFSsrLB2Le7c4XEXQ8IhNDbPPYcpU4QugjUFD8wYtuHD0aZN/caoKJSUoF07AOjSBcOGwdq6/jzOzhg2DO3b66JI1jC+isKolJfj+HFUVCAwUOhSWKNxCI3KyZMYPBg+Prh4UehSWKNxCI2KTAYHB1RWIj8fTk5CV8MahwdmjIq5Ofr2BRF++03oUlijcQiNzeDBAHDihNB1sEbjEBobDqHB4X1CY5OTgzZtYGeHgoL695Vh+ol7QmPj6oqOHVFSgj//FLoU1jgcQiM0ZAgAHD8udB2scTiERoh3Cw0Lh9AIcQgNCw/MGCG5HE5OKCtDTk7tfWiY3uKe0AiZmcHXlw/ZGwwOoXFSjs3wFqlB4BAaJ+VuIQ+QGgTeJzROeXlo3RotWqCwEPzMNT3HPaFxcnFB584oK8MffwhdCnsSDqHR4gMVhoJDaLQ4hIaCQ2i0TPDktfz8/KqqKqGraDIOodHq2RP29khPR3a20KXoRFZW1ujRo6dPny6Xy4WupWk4hEZLLMaAAQBw8qTQpWhfWlraoEGDzp8/f+vWreLiYqHLaRoOoTEzkd3ClJSUESNGZGRkjBgx4vDhw87OzkJX1DQcQmNmCiE8dOjQ2LFjc3NzAwIC9uzZ4+DgIHRFTcYH641ZYSFatoSFBYqK6j8azTj89NNPwcHBlZWVr7766saNG80fPLHRoHBPaMwcHdG1KyorkZoqdClaEBsbO3Xq1MrKyoULF8bGxhpoAsEhNHrGeiZ3ZGTkrFmz5HJ5WFjY6tWrxWID/ks24NJZYxjfbiERLV26dNmyZWKxeN26dREREUJX9LT43F4jpwxhcrLQdWhITU3NvHnzvvrqKwsLi82bN0+bNk3oijSAB2aMnEIBFxdUVOD2bYO/yr6qqurll1/etm2bjY1NQkLCuHHjhK5IMziExi8tDZ6eBj86WlpaOnny5P379zs7O+/atWuwsos3CrxPaMyGDkW/fsjOrp/AsWMxa5ZANTVLcU7O8OHD9+/f36FDh+TkZGNKILgnNG4tWqCiAt7e+OMPWFnVtru4wNvbcEZrbt6kcePmuboezc3du3evu7u70AVpGPeERs7VFVev4sMPha6j2c6fx9ChoitXvqyuPn70qPElEBxCo9e/P55/Hh98gKtXhS6lGU6dwpgxyMrCqFGSffucXFyELkgrOITG7+OPUVODBQuErqOpDhyAnx/y8jBpEnbvhr290AVpC4fQ+HXvjrfeQlISvv9e6FIa7/vv8fzzKCnBzJn48cc6e7RGh0NoElauRLt2+Mc/UFAgdCmNsXYtXn0VMhnCwvD110Z/uzgOoUmws8OqVcjJwcqVtY1VVdi8GffvC1eWWpGRWLAARPjwQ0REQCQSuiCt4xCaipdewtixWLsWly6pWg4cwIwZaN0aw4YhMlIPRm6IsHgxli2DRIL16/GvfwldkI5wCE3Il19CLMbSpaqXNjZ47jlIJEhOxrJl6NIFvr54912BblUql+P11/Hpp7C0xNatmD1biCIEQsx4WVtTQECdln//mwASi2nQIFVLaSnt2EEhIeTgQIDqX8eOFBpKSUlUXa2TQsvK6PnnCSBbW0pK0slb6hEOoRHKzaX9+4nUhbC8nDp1IqA2hA/IZHT0KIWGkptbbRpbtqSQEIqLo5ISrZV7/z4NHUoAubrS2bNaexv9xSE0NrdvU/fuZGVFR46oCSERJSaqD+EDNTWUnExLl1KXLrVptLGh27NX0KZNlJ+vyXKzsqhnTwKoUye6ckWTazYcfO6oUUlLw7hxuH0bPXpg717Y2MDMDLa29WcrKICZGezsnrzCGzewcyfi45GdIb9+2xwAJBIMGoTAQEyZAm/vxlaWno60NFRVwdUVvr61Z5QXFWHkSMhk2LsX7ds3dm1GRuhvAaYxKSnUqhUBNHAg5eVpeOVlmQW0di099xxZWNT2j3370jvv0B9/NLTkyZPUr1/tIgDZ29PKlSSXq2bIzNRw72poOIRG4tAhsrcngAICqLxcm+/U8EiOTFZn5qNHydqanJxo1So6d46uXqUdO2jkSALopZe0WaUh4RAag8REsrIigF55RVfjmdSIkRy5nDw9ydqazp2rv6ByLDQhQVe16jXT3ie8fBnbt+PyZVRVoU0bjB6NF16Aod23a9MmzJ4NuRxvvYXPPhOifIUCqanYuRNxcbWnAsTFwcYGL7yABQvwxRf1F7lyBd26YexYJCXpuFh9JPS3gEAUCgoLI4mExGLq3p369FFtzPXuTenpQhfXBFFRJBIRQGFhQpeidPEivfceDRlCxcWqg5I7dqifs3NnsrGp3TM0YaYawnffJYDGjaNbt1QtVVX08cckkVCXLlRaKmhxjaJQ0NKlBJBEQuvWCV2NWiEhBDx22MbPjwDKzdVtTfrIwDa9NCM3F++9B29vJCbiwZXaFhZYvBhvv40rV7B2raqxvBy5uUKV2YCaGkil+PBDWFhgyxbMmyd0QWrJZADwuBtjK9urq3VXj74yyRBu347KSrz5ppqr1P7+d5ib1154l5iINm3Qrx9WrMDlyzou83GqqjB9OjZsgI0NduyA/t56U/l0pPx89VPz8yESwdCeoKQNJhnCs2cBYNAgNZOcnNC9O86fh/JBkxkZsLDAmTNYuRLduuHZZ/F//6daXCClpQgIQEICnJyQlAS9vvXmM88AQEqKmkkVFbhwAV27GvfVuo0l9PawEKZOJYCuXlU/1d+/zr5KWZnqsJijY+1AvLs7SaW0YwdVVemsaiK6e5f69CGA2rZ9whFyvZCZSebm1KtX/YOHRLRuHQH09ttClKV3TDKEwcEEUFqa+qmjRhFAhYX12+Vy1WGx9u1r0+jkREFBFBtLxcXarvrmzZtDh451c7vt5UXXr2v73TTkH/8ggGbPrnMCQVIS2duTqyuPyiiZZAiVfxnKCw0e1bkz2dqSQtHQGi5coPBw8vWtTaOVFfn5UVQUZWVpo+Tz58+7ubkBmDgx5N49bbyDdlRWqrY7WremoCB67TUaOJBEImrdmn77Teji9IVJhnDrVgLoP/9RMyk9nUQiGju2sau6coU+/JCGDCGxWJVGiUTu5/fJxx9f11xvderUKRcXFwCjRo0qKirS1Gp15+efKSSE+vUjHx/y86OICCooELomPWKSISwvp1atqGVLys6uP2nmTAJoy5YmrzM3l2JjKSiIbGyyBw5U7m/7+PiEhYUdPXpU0XC/2qD9+/fb2dkBmDRpUkVFRbPXw/SWSYaQiH74gUQi6tqV9uxRDRukp9PrrxNAzz33hG3RhhUXn/vpp5dfftnR0fHB6JeHh0doaOiBAwdkjw5RNGjbtm2WlpYAZsyY0dRlmaEw1RAS0XffkYsLAWRmRjY2qrs+zJxJZWVERJ9+SqmpT7N6uVx+9OjR0NDQ9g9dJufk5BQUFBQbG1vciIGcNWvWKB9AGxoa+jR9KdNzpn0Cd1kZDhxAWhoqKtCuHcaMgacnAFy6BB8fAPDwwLhxCAjA+PGPPfOjES5evBgfH79r164zZ84oW6ysrIYNGxYQEDBt2rS2bds+ukhkZOSyZctEIlFERMTSB/dmYkZJ6G8BvXTtGr3xRp0rdFxc6LXXaPt2VT/ZXDdu3IiKivLz8zP764a2YrHY19c3PDw87a9DJgqFYvHixQAkEsn69es18XmYXuMQNujRQxHK27ZER6sZ1GmKu3fvxsTETJgwQbnLB8Dc3LyoqEgmk7322msALC0tf/zxR019DqbPTHtztPEe3GvlxAkoFMBDt1qZPBldujR7xSUlJXv27ElMTKyuro6NjZ06deru3bttbW23bdvm7++vsfqZHuMQNlFeHn75BfHxSEpCVZWq0ccHgYEICMDQoc2+bXthYWFAQEBycnLr1q13797dt29fjdXM9BuHsLmKi7F7NxITsXs3ioqUbYtGjxY9++ykSZOGDx8ukUgav7K7d++OHz/+3LlzHh4e+/bt6/IUXSszOBzCp1ZdjUOHkJhYdeqUdWqq8vfp7Ow8duzYgICAyZMn2z3p1oLV1dW9evW6cuVKjx499u7d265dO53UzfQFh1CTHj0UYW1tPXbs2MDAwIkTJ7Zp0+ZxC27ZsmX16tW7du1yMdKH0bIGcAi14saNGzt37oyPjz9x4oRCoQAgkUgGDRoUGBg4efJktVubCoVCbGj3mGIawSHUrry8vF9++SU+Pj4pKanqr4EcHx+fwMDAgICAoUOHikzg+XusYRxCHSkuLt69e/f27dt3795dXFysbOzUqdOkSZPmz5/v3fj7yTOjwyHUtZqamhMnTsTHxyckJGRmZgJITk4eMmSI0HUxwXAIBaNQKE6dOrV79+7w8HDeGzRlHELGBMZfwIwJjEPImMA4hIwJjEPImMA4hIwJjEPImMA4hIwJ7P8BAH8n0Fl4ZGsAAAFyelRYdHJka2l0UEtMIHJka2l0IDIwMjEuMDkuNQAAeJx7v2/tPQYg4GVAACEg5gfiBkY2BgsgzczIwsGgAWIwsSusAtKMzExM7BARZnaFRWARRiiDkZmNIQHIYGJiU9ACCTAxwzRzMCiAJCDyjMxwEyDqGTnB0kBzdkEMZAZanwFWwcjPYAAWY2MoABvJxM3AqMEENJmJmYWBhZWBhY2FhY2dgZ2Dg4mTi4WFk5uFhZuHhYWHl4GPn4OJX4BBQBAowqAgwiD+CGQA3KdRUlH7XzEt3Q/iFKoLHWgqCwezQ9cLOhxznegAYq+elGR/0mwxmL3ilI79mr2XwOzl097adwd/ALMZE8z3r1/3BMwOfvhp/3mJ4xA2p+uB900rwey6guv2D4stwOZbhhk5nIyabgdiy+9usJM72b0PxJ6QP3cvS9oMexB7vcTB/WvXXgSzvyX/tZ+V6wc250GBpP21axow9v6e7iQHqJr9J7/YgNliADMZVjP12c70AAAB5npUWHRNT0wgcmRraXQgMjAyMS4wOS41AAB4nI1USY4bMQy8+xX8gAUWJYriwQcvk0mQjB1MnPlD7vk/QrXd021EGUS2gV6KW1XRG+rn9fT11296P3LabIj4g6+701tm5s0L9Qs6PD1/OdPxuj/MT46Xn+frD0IjaMTE5xG7v15e5iegI205NYVXpS2SNIeCOPF0llihC20l3ueqNsUUVJUBMtOZAmg1S6WSNLtVW+Ho+Pl5B3rdn3aZ3vbfdjJHloiMxE1ZmTSBueQ2qKATrlrxSFyTNq2axxVkqpDnyBqRiHErKpMlBcPbR5GYI+3GlKFm9ghFifnyoLnWgVHDTRnRnQjMBjUe+vLObk5srXqJ0cVN8ig7OJBItWUITw0JK0YkoWsrKTIqeibxmLqMgDLRKYoiracUy0HLCNmlDQBbbZajDThXDNss9KmzoBxc195wbhgjdZLEzXumHHRpKfxfYqLGhJzUPZvHqP+uYfS9931H5r89+Y68q3dvR5KrPLYzI5/Op4dNuu3W4XI+Lbsl/bcskMRqlGVLEH7XxfoIW9fF4f3WFtsiDNgWL0rYzBfHofsCWNx0eyAr16DrjLxyB7qeKCsbSFcDdSU3OsmwlazobKKt5LtlXvOyZqHfz/9Ocb35A6h+8VaI+d9cAAABCnpUWHRTTUlMRVMgcmRraXQgMjAyMS4wOS41AAB4nDVQSW4CQQz8So6gMZaX9gbiNFKU05A7gpfw+LgncGjJXYtd9nrbDuv1dty+cf1dr/ftZ3ngfVse8x3W+7o8Jnud36/XQTDSjYFQypwHXBg9lQVOhCFknHBp0nhITkxCiQsuXaZxucGJUbLYGpOu1H3qcrCb7DoKz5ACRi5ybozRKC0acU3+RyqqOcEyGWP3WZVGgaJpRcwYb0Q+to9LUcTGHj57C4dAY5Jp8RjlAY7WjO19g12pWsPDVfbhWWGtEeHofU/amdMLrK8SorNPppE1wERzUG8argrjHe4ITz4zQR/uKWcOeNqZ+fUHV4lTA0ek02oAAAAASUVORK5CYII=",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAIAAAD2HxkiAAAABmJLR0QA/wD/AP+gvaeTAAATX0lEQVR4nO3deXBV5f3H8SdAQgqRkhC2kAXTNqCAslmIUJaIQiFtnUosHYm/ymBMpaa1tcb2x5iOgjKKNUzVaTp1mKh1JFJ+hSktuwsuBISyyI4QdhVZEhIl6+f3x7nmJhHCTXKTL5b3a/iD3NyT80yS93me++RAQiQ5AHbaWQ8AuNoRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIx1sB4A8N9jw4YNJSUlN954Y8+ePQM/ipkQCJpnnnlm4sSJ69evb9JRRAgETWVlpXMuNDS0SUcRIRA0VVVVzrkOHZr2Ko8IgaBhJgSMMRMCxpgJAWPMhIAxZkLAGDMhYKx5MyG3rQFBc0NkZHRcXCciBKy8euKEO3rUsRwFzFRVOeeIELBTWemcc+yOAmaYCQFj3kxIhIAZbyZkOQqYYSYEjP13z4Tnzp1LTU394IMP2vSsa9a4J55wc+a4Vauc1KanxteO5KqrXUiIa9++Scd9bSJ8+umnly9fPmLEiMzMzDNnzrTFKR9+2D38sOvVy8XGuv/9X5eV1RYnvZR333WZmW7yZHf//W7jRsuR4FKatRZ1zjldeQ4ePHj8+PHdu3fXfbCsrCwnJ6djx47OucjIyNzc3KqqqlYcxL59io7W2bO+N0tK1KOHPvywFc/YiPXrFROjRYu0Z49eeUU9e2rTJpuRSEOGaO5c399379akSVYDufKUlck5derU1OOurAjPnDmTnZ0dHh6enJwcGhqalZVVUlJS9wn79u2bNGmSd/kYOnTo+++/31pDefll/fCH9R5JS9Nf/tJap2vcLbdo4UL/m889px/8wGYkUmSk4uPlXSG3bdPAgVYDaUxxcfGCBQsqKira9KynT2vdOm3cqLKyJh13pURYXl7+7LPPRkVFOefatWs3aNCgdu3aOediY2MXLVrU4MnLli1LSEjwnpmenn7q1KngD2jBAk2fXu+RjAzNmxf8EwWiWzcdOOB/c/t2xcXZjESKjFRensaNU03NlRvhL3/5S+dcUlLSypUr2+iU8+crNlYzZ+rOO9Wrl9atC/zQKyLCZcuWffvb3/bmt5SUlM2bN0vasmVLcnKy9+C4ceM+rL8UrLs6jYqKys3Nra6uDs5oqqt18qSWLtWoUfUev+UWLVqk8vLgnKVJrrlGR47439y7Vz16GAxDkhQZqXPnNGaM8vOviAi/+OKLysrKBl/9lStXJiUled88P/3pT48fP966g9i5Uz166OOPfW/++9+69lpduBDg0cYRFhYWfu973/M+Wf379y8oKKj73pqamvz8/B49ejjnLrU6nThxonf4sGHDNmzY0NIBrV2roUN1440qKVFMjN580/f4e++pVy+dPavkZKWn69NPW3qiAK1eraoqDR2qf/3L/+DixRo9WlLbDaOOyEgVF2vHDvXpo7fftoywpqamoKCgb9++99xzz1dfm1RUVOTm5kZERDjnOnfunJOTU956F9Ann1RmZr1HkpIU8HejWYSHDx9OT08PCQlxzkVHR+fm5lZWVl70mWfOnMnKymrfvr1zLiYmJj8/v8ETli1bFh8f39LV6c6dmjJFzsk5xcXpo4+0Zo3i43XrrZo4UXFxWrFChYUKC5Nz6tZNeXkK1tx7UR9+qMmT5ZxefFELF2r4cF9yJ05o0CAVFOgf/1CnTsrJCfyK2xKFhRozRps2+SKU9NBDmjhRAweqoECPPKLS0jYYhd+aNWuGDBniXX+7dOniffUzMzNPnz5d92nHjh1LT0/3ntavX79Vq1a1ymhmzdJjj9V7JCVFixcHeLRBhKdP68EHNXr0H51znTp1mj179vnz5y97VN3V6fjx4y+6Og0LC2vO6vTUKWVlqUMHOafOnZWTo88/972rpkYHDmj/fn9v+/fr+9/3tTp0qFpjZ+jIEd19t9q189W+cKFqavT44+rXT0lJ6t9f8+dL0oMP+oZx3XVasyb4w/jS/v2aOlUhIXJOaWn+CMvKlJCgAQMUF+e7cL3+euuNwm/37t1paWned0JsbGxeXl5JSUmD1yYNds7Xrl173XXXeYekpqYeqbu2D4rHH9cDD9R7ZOBAvfNOgEe3aYQXLmj+fEVGyjn17VsxY8bMY8eOBX64tzrt3r37pVanO3fuHD9+vPe5Tk5OLioqusxHLCvTvHnq0kXOqUMHZWT4l/WNW7ZMCQlyTiEhwVydlpYqJ0ff+IacU2ioMjLUYFZv8FOZN97QgAG+FFNTdfhwcIbxpdOnlZ2tjh19G+/Z2Sou1s9+5r9GLV+uX/9amzcrOdk3ivHjtXNncEfhd+rUqaysLO9/cImIiMjJyfm8diiX2zlvldXp0aPKyNDvfqf331d8vL74wvf41q3q2TPwtUHbRbhsmb71Ld+X6pZb9J//NPPjBLg6jY2NbWyCra5WQYEvJOc0YYJ27GjaOEpLlZ3tW51GR6986eOWLE4rK/X88zoy8Pu+sKdN08GDAR1ZUaHcXF1zjS+UIK1OKyqUl6foaDmndu2UlqbGL2g1NcrPV/fuvqtHVpbqXx5bqqysbN68ed6ys0OHDhkZGR9f4nLZ+M550FanxcV65BHf5bJrV5WUKDNTQ4dq/nw99ph699arrwb+wdoiwg0bNHq0f+lUf/OlmTZv3jxy5Mja1enO+pffkpKS/1y68lWrVk0YM6bY+8a96Sb/7ksz7NunSZOOJqe1ZHG6erUGDpRz+p/RBzRihNavb/KHOH5c6em+T3FSklasaM44JEk1NSoo8F8uJ0xowuXys890772+dXR8vN5adq7Zw/CrrtaLLy5JTfW+1rfffvuePXsaP+KyO+ctWp1WViovTz17+i6XaWn66CPfuzZs0PPPa+FC/yOBCTTCoiK9957/zb17tXlzvSesWeO/n6SqSn//uyTt26e0NN/Lieho5eY2XE+1xGVXp1+1Y8eO2hXL3Ntv19/+ppqalo/k338vi431TRqZmaq/NdCYTZs0dqy/nf9b0rLBrFqlfv28D7fxN79p0lLf8/bb68eOLfXGM2hQM1vevFkjRyosTLsSp7R0ebpypW64Qc7VREb+OCXlrbfeCvzQxnfOm7k6rb1eOqeRIwN/1de4QCN86SVNnep/c/583X9/vSfcdJPi4+UtAMvKFB6uuXMVGurf7Gil3bO6q9M+ffp8dXXq8V5OeE/zXk58UbuCD4ayMuXk+F4+RUUpN/cyW6feqwlv0oiK0rx5QdrjrKhQbm5FUlKPzp07deoU+Cufffv2paWlhYSEjB2bExOjvLyGl8uiIv31r4GOorpaG17aq6goOaeOHfX73zf1JhLt2qW0NP9mdXP3ohvfOT969Ki3Or3MixdJmzZp3Dj/9bKgICiXb08wI5w0SQ89JH0Z4SuvqF07pafrxIlgjfaS6q5OU1JS6q5O676cCA0NzcjI+OSTT1ppGPv2aeJE31dq2DBt2KD0dOXl+d776af6yU98f582Tc4pPFzZ2ToXjFVbXccOH77jjju8z8b111+/rtG7N06dOvWLX/zC+68yIyIi5s59qsHl8vx5325R+/bavr0p4zhzRllZat9ezqlPH13i+tjQ8ePKyPAdFRGhnBy17HJ52dXp8uXLly9ffqnDi4qKnn3wQd9yrnt3Pfecgn03XBMiTE3VsWO+P48+epEI33pLcXHats0XYU2N6t+D3bqqq6sbrE6Li4vz8/N79+7tfTtOmDDhwza5A/u119Snj5zTrbcqMVHdu+vQIUk6ckQxMXrtNT39tJ58UunpQd/OrGfdunXXX3997Sufw185WXl5eW5ubteuXWsnihP1r5cVFfrTn3zbMyEhuusuHT3a9HF4y1PvypSSol27/O8qKVGd7U3fZrX3Wt3bHA7e5XLv3r11V6eFhYWXPeT8+fM5OTnh4eHOubeHDVNWVvCvl5KaFGF0tMaM8f1JTLxIhFu26OWXlZys0lKFhwd/rIE4derUzJkzvftOv/nNb3qf9BEjRqxvxm5HC5w/r9/+Vrt2KTFRs2crNVX6MsJPPtHhw22xOtClX/l495okJibWXp62bt3a4NjVq/0//hg5Uu++24JxVFfrhRd8q9PwcB0/7vvhyuDBGjBAw4Zp2zbt3q3evX3nu+MO7d/fgvNdUoD3dVRUVCxYsCA6Otp75vTp04+05vUymMvRLVtUU6Nx4/TnP5tF6Pnggw9GjBgxc+bMuLi4/Pz8muAt35sqMVEHD2rYMC1Z4ouw7dXdl09KSsrNzb355ptrF6v//Oc/Gzy/sLBw+vRHvBz699fSpUEax+nTysrSvffq3Dn16qW1a32PL1yofv104YIGDPAtqFpTaWlp4/d1rF69esCAAbU/bX63RZefgAQ5Qkk7dyo21jhCSVVVVZWVla14u2BgEhNVVKTCQiUkaM8emwg9K1as+M53vuOc69atm7eJlZeX1+DOkoMHD06bNs27lzAlZdXzz+sStxK2QHW18vM1eXK9BwcO1Lp1OnkyiLsdjdu7d+9tt93mlTZ8+HBvdbpx48YxY8bU/hSxICg/TAtAiyKcNUv33ac779SFC/4IJT38sH2EVwgvQkn33acZMywjlHThwoU5c+YsWbJkzpw5ZfW3K8+ePev9S07nXFhYWFZW1rnWef0jSTk5ysqq98iPf9yEvdfgefXVV2NiYpxz7du3HzBggHf16dGjxwsvvHCpO5lbQ6ARnjxZ75aSw4e1d6/vHq9f/Upbt6qw0H+TRFmZf61xlauN8PRp9expHOFFVVRU5OXlef9UJSQkJC0t7WCAN+s02x//qHvuqffIhAmB3+4cXN7qtEOHDvHx8R07dszOzm7Fq88ltPSOmfJyTZ7c5B8CXT3GjlXtz8xfekkjR5qO5mK2bdvm7WPV/kvOVvfOO7r2Wv9K9+xZRUX5dpCNTJ061Tn31FNPmZy9Rb+V6fPPXVaWmz3bderUkg/z3+zNN/1/T093X+6PXEFuuOGGRx99dPjw4VOmTGmjU44a5QYPdlOnugcecBUV7okn3N13u7592+jsF9O5c2fnnPfzrbbX/AjLy93NN7trr3VLl7ouXdyX+0n4+snJyWnrU772mnvlFVdQ4EJD3QMPuC//aZIV7zfsNvWXewZL8yMMC3NvvOH7e0REcEaDq0VYmJsxw82YYT0OH+837Db111wHS/PPGhLiIiODOBLAjO1M+LX5z3+B1mM7ExIhwEwIWGMmBIwxEwLGvAiZCQEz3nKUmRAww0wIGGMmBIwxEwLGmAkBY8yEgDFmQsAYMyFgjJkQMMZMCBiznQlt0geuKAkJCeXl5VYzYYgkkxMDV4ji4uK1a9cePHgwKSlpypQp3q/uaktEiKvagQMHxo4dm5KSMmTIkDVr1vTt2/fnP/95SUlJ586dBw8e3DZjIEJc1aZOnZqQkPDMM8845ySVlZVt3Ljxs88+69q162233bZr167a32zVeogQV7W+ffsuXrx4+PDhX31XaWnpXXfdtXTp0tYeAxHiqhYREbF9+/ba3xLXQFlZmff/ArcqfkSBq1qfPn2OHj160XeVlpaOHj26DcbATIir2qxZs06ePPn66697m6KSvN/N1JaIEFe1s2fP/uhHPyopKfnud7976NChUaNG/eEPf2jjMRAhrnaSDh06VFRUFBMT079//7YfABECxtiYAYwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIwRIWCMCAFjRAgYI0LAGBECxogQMEaEgDEiBIz9P+WaRLoztjIoAAABIXpUWHRyZGtpdFBLTCByZGtpdCAyMDIxLjA5LjUAAHice79v7T0GIOBlQAA+KL+BkZ1BA0gzM7MxZIBpRg6IABO7ghKQ/s8E48MVwBnsChZgGaDeBCCDkRmhFEyzsCmsAhnBzMiEYTo3A6MGEyOTAhMzUB0DC6sCK5sGExu7AgcnCwsnlwIXtwIXjwYTD68CL4OCCIP4JpD5cMe3lzfb/7iwzQ7E8b87cV9w5d59ILYO58n95nLnwOLMNRYHhHWWgcUrkloPlGc/BYvrxa0/cOVeH1h8SdONA9t3/IGI2zMe1FDOB4vXfD3uIMz2yB7EtpY77lBp1gFW06I01+GS8BuwGhfvOQ5Zf3/tB7Fl/6Q77GieD1azgUXEYfKxK2A1YgAImEWNagRLLgAAAaZ6VFh0TU9MIHJka2l0IDIwMjEuMDkuNQAAeJx9U0GO2zAMvPsV/EAEkqIo6pBDYm/Tol0b2Gb3D733/yipRdYOIFQOAZkajpgZeoJYb8vPP3/ha/EyTQD4n19rDT4yIk6vEBu4vtx+rDDfL9dHZt7e1/tvIAHKXuPPM/Zy314fGYIVKCFXtAKYcqmoXpSwr72SYYYTJjaxxrHLFVF1gMywwYmSExVHYhLkUmUAFL/6xMmMi7ZOyVJKOSBh/n47nwg+Lr/O/CgrwS+J1Lzp4BdDGzWi0XJJfsxSe/O1oYw6qYHUVLU0saBsubQ6AFq0bAlrbSydMueSR3o1p9TEYpXUBXZqIxzgPLkFkFkkzlkVhUZAckZJjVC0Xy1KaG2E5I40EzILK5q6uW2g69tlOeeuLn0VZy/OSV2yPgeZqBQe3SLeOPs5V1c/+nFgHYn2si5PI/c5hNdtXfYh5B7zt9vu82cq72NFHrIPD3mUfSjIQ3fr2aM+E1bHVLDdS3KX6OAYhRtEB2soZCc+eMA9k5+ZKXr1JMlBRuof4FGE41+O98c36/vpH7Qvw9ZT3rI6AAAA13pUWHRTTUlMRVMgcmRraXQgMjAyMS4wOS41AAB4nCWOS44DMQhErzLLRMIIMD/Hysr77gNEyUly+OCeBVKpeFD1Wu29bs91HjWvo73P9VzH/Vx/35tipvKAxjic0mEqDiZ1aITqTDlgdnTRcCDszGYCU0pJjAsqJwImI0nQ2JAFeYdZS0nNIRvrQeT1voJqbZtTEgstS6pEyQsTNbPyFNlTYmOaV7FmWEpsY5VNuk8dw23Yxka3UT1aIkX8h0rv1quJo4gUX447KV+OZgjwvk+GO3zkQd8f5Y49hrCix4IAAAAASUVORK5CYII=",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAIAAAD2HxkiAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3deVxU9f4/8NewDAiyhAjmhitq7o5rmJliV42uSResvj+0soZcGuy6YGZhFysyl4FKG9R7hbIMl1uaWZGpqddSwH0BcRcUURGUnZn374+ZQEaEGZiZzzC8nw//mPnMOZ95g7zmvOfMOWckRATGmDh2ogtgrKnjEDImGIeQMcE4hIwJxiFkTDAOIWOCcQgZE4xDyJhgHELGBOMQMiYYh5AxwTiEjAnGIWRMMA4hY4JxCBkTjEPImGAcQsYE4xAyJhiHkDHBOISMCcYhZEwwDiFjgnEIGROMQ8iYYBxCxgTjEDImGIeQMcE4hIwJxiFkTDAOIWOCcQgZE4xDyJhgHELGBOMQMiYYh5AxwTiEjAnGIWRMMA4hY4JxCBkTzEF0AY2GQoGiIjPOP2MG+vc34/zMakmISHQNjYOnJ/LzzTj/5s0IDjbj/Mxq8ZbQUJ9+itJSM84/YIAZJ2fWjLeEOuXluHcPjo5o3rzaeHExSkrg4QE78799LipCaSlcXODkVG28oAAA3N11dy9dgp+f2YthFsM7ZnT27IGXF9q0QXZ2tfHoaHh54epVS9Qwdy68vDBhgv744MEYPbrqbrduliiGWQyHsJqCAsyZI7iGn3/Gxo2Ca2CWxCGsZtgwfPMNfvlFcA2zZula0PudO4eePdGzJ8rKdDeOHRNRHzM1DmE106ahSxfMmIGSEmE1fPIJrl3DwoX645074+RJnDwJqVR3o08fEfUxU+MQViOVYtkyZGbio4+E1TB4MCZPxuef488/hdXALIk/otD3979j3Dh8/DFeeqnaLpA+fWpoEU1Ipaq6HROD777DzJn44w/Y2+svuXlztbtyuTwgIGDKlClmLI6ZE4ewBnFx6N0b06dj586qwcuXzfthfWFh1e1WrRAdDYUCq1Zh5kz9JZ95puq2RqPZtWuXe+XHF6wR4hDWoEsXREbi/ferbXOOHYNGY8Yn9fGplvnp0/Gf/+C99/DCC7WtZWdnd/bsWTOWxcyPQ1iz+fPx1VeYOxcTJ+pG2re3aAH29li5EgEBeP99iz4vszzeMVMzZ2d8+ikuXMCXXwqrYehQTJ0KlQo5OcJqYBbAIXyoceMQHIzcXJE1xMTA0xN37oisgZkbh7A2SqX+oaQW5uWFDz8UWQCzAH5PqNO7N5KSMHRotcF27ZCcjCtX4O1tiRqmTsXIkfqfSbz6Kry8wLs/bRifRWGoCxegVptx/kcfhaurGednVotDaCg+qZeZCbejhurUybxHzIh988kE4i0hY4Lx3lHGBOMQMiYYh5AxwTiEjAnGIWRMMA4hY4JxCBkTjEPImGAcQsYE4xAyJhiHkDHBOISMCWbLZ1Ecu3fvzczMB8c39uzp4+ho+XpM7p//xLp1eP55rF5dbVwmg5cXkpN1d52dRV5QnNXJlkNYARSq1SM8PHpVP02ouQW+5cwiioqQl4e1a/Hiixg1qmq8oAA28SLTVNhyCLWGeniEtmwpugozeuwxzJiBo0chlVYbv3gR06cDQHk5xo8HgNhYdO0qoEJWOxvZJjRlH3+MM2ewZIn+eJs2WLUKq1bB0VF3Q/vVort27bp48aLFy2QPxSFsZB48B3vcOIwfj8WLkZFRbdzREX5+uuBpb0ilqKioGDt27IIFCyxULjOA7bej63Nyfrp9u/JusLd3UIsWAuupN40GX32FTz7B/v36F19TKtG7NxQK/PRTDSuuWFF128HB4eeff+7YsaN5a2XGsP0toZu9vY+jY+U/lwe/5agx2LkTfftiyhScOIENG/Qf7doVc+fi55+RlFTDutOmVbs7cuRIP/7Oe2ti+1vCv3t7N+odM1eu4J13dFfjb9cOixdj8uQaFluwAF9/jdmzq31n04M0Gk1gYOD48ePnCP9acPYX298S1mh9Ts7m3FyNdV/kqrAQixbB3x9ffglXV0RFISOj5gQCaNYMsbG4ehVLl9Yxrb29vZ2tfEhjG2x/S/igm+XlK7OzSzWaTbm5s9u1G+jmJroifUTYtAmzZ+PKFUgkCAnB0qV1fy1UUBAmTMDSpXBywsPe9trZ2SVXforPrENTfEX0dnT8qFOnNk5OZ4uL38jIeCszM6u0VHRRVQ4dQkAAQkNx5QoGDcK+fUhKMvSL2eLiQIRbt8xcIjOpphhCACM8PDb17Dm7XTtXe/u9+fn/OHly6ZUrhWa9zL0BsrMxeTKGDMGBA2jdGioV/vgDjz9uxAzt24M/fWh0bPniv7nl5Tvz8ga6uXVp1uxhy9wsL4/Pzv7u5k0N4O3oKG/d+jlvb8u/MhUXIy4OH3yAu3chleKNN7B4Mepsk7/4AiUliIiARFI1WFaGhAS0bInnnjNrycxkbDmEhjtVVLTsypWj9+4B6OHiMqddu74WvCr9tm2IiMCFCwAQFIS4ONT5MV52Nt5/H2vWYOZMxMZaoEZmRk20HdXzmIvLmm7dYjp1aiWVni4qei09ff7589fKysz9vIcPH37ppZgJE3DhAvr1w+7d2LatjgSWlOCDD+Dvj/h4SKV45BFz18jMjreE1ZRoNInXr6/LySnTaJzt7Cb7+r7cqpXUDDv0b9y4sXDhwrVr12o0mrFjz0yc2G3qVP1vJnzQtm2YNQvnzwNAUBBiY9Gpk8lLYxZH7AHXS0vfvXBBlpIiS0kZd+zYDzdvakw3eVlZmVKp9PDwAODo6KhQKPLy8upc69Qp+tvfCCCAevSgn34yXUFMNA7hQx0qKHjh5EltFOXp6SfPnWv4nMnJyT179tS+/AUGBp44caLOVW7dIoWC7O0JIC8vUiqpoqLhhTArwiGsjZroh5s3xxw58szXX9vZ2YWFheXk5NRvqvT09KCgIG38/P39t23bVucqZWWkUpG3NwHk6EhyOeXm1u/JmVXjENYtv6Li/aVLHR0dAXh6eq5YsaKsrMzw1fPy8iIjI52cnLSrx8TElJSU1LlWcjL17KnrPwMD6fjxBvwAzLpxCA1Vj02ZWq1OSEjw8fEBYPiGNCODQkJ08evalZKSTFE9s2IcQuMY/qZu165dffv21S755JNPHjlypM7J79y5M2eOxtGRAPLwoGXLyJgtLmusOIRGq3P35uXLl8PCwiQSCYC2bdsmJCRoNHXsXtVuM319fUeMOGlnR2FhdP26OX8GZk04hPV08+ZNhUJhb28PwMvLS6lUVlRUEFFqaqqzszMAV1fXxYsXFxcX1znV7t27+/Xrp91mBgW9cviw+atn1oRD2CBpaWkjRozQ5qdHjx4//fSTWq0eMmRISEjIxYsX61z9ypUrxm4zme3hEJrA1q1bK6/aEhQUdPr06TpXKSwsjIqKatasGQAXF5eoqKiioiILlMqsEIfQNIqKimJiYtzc3ABIpVKFQlFQUFDjkhqNJikpSXuVF4lEYuA2k9kwDqEpXbly5aWXXtK2l7Nnz35wgZSUlICAAO02UyaT7d271/JFMmvDITS9/fv3jx49Wu8jwezsbLlcrr24y6OPPqpSqSr48DNGRER8FoXZlZWVrVq16r333isoKHB0dJw2bVp0dLS73pVDWRPWFC/0ZEnbtm2bNWvW+fPnAQQFBSmVys6dO4suilkX3hKa18iRI/fs2dO9e/fly5ePGzdOdDnMGnEIzevw4cMHDhyQy+UODtx0sJpxCBkTjK8xw5hgHELGBOMQMiYYh5AxwTiEjAnGIWRMMA4hY4JxCBkTjEPImGAcQsYE4xAyJhiHkDHBOISMCcYhZEwwDiFjgnEIGROMQ8iYYBxCKzJjBiQShIbqj3fvjkGDACAoCJ6eNawYFAQPD7OXx8yEQ2h1Nm7EDz/U/FBFBcrLjRhnjQKH0Or064eICBQXi66DWQqH0OosWYLz57F4seg6mKVwCK3OyJF4/nksXYpTp0SXwiyCL4ZZs6VLl3777bf1WNHff1FGxjP1WHHJkqrby5Zhxw5Mn45duyCRVFustBRjx+qvm5pajydk1oJDWLNLly6lpKTUY0Unp5v1Wg95eVW3/fzwzjt45x0kJmLKFP0lXV31R+zt6/OMzErwxX9rdvny5ZycnHqsaG/fSa1uUY8Vu3bFO+9g5UqUlcHREWVl6NcPt28jPR1DhsDNDYcOYexY7N2LwkL9dceOxe+/o6ioHk/LxOMtYc3at2/fvn17gQVIpfj0UwQGIiZGYBXMEnjHjPUaPRovvIDYWNy8KboUZk4cQqu2YgWkUty6Zejyx49DoUBYGL74AhUV5qyMmQ6H0Kq1aoWoKEMXPnoUTz+NXr0waRJUKrz7rjkrY6bD7wmtyIsvom9f/V2db74JNze0aAEAb72FF1+sYcW33sILL6B7d+zahe7dAaCsDO++i48+Mn/RrMF476ht+vJLfPEF9u8XXQczALejNqiiAp99VsMHjMw68ZbQ1mg0mDoV+fnYuJE/xG8ceEtoU27dwvjxKC7Ghg2cwEaDt4S24/hx/P3vaN0aERG6I06DgzmKjQDvHbUd2dl4+mkA2LlTNzJhAoewEeAtIWOC8XtCxgTjEDImGIeQMcE4hIwJxiFkTDAOIWOCcQjrdvfuXbVaLboKZrM4hHUoKyvz8/OLiIgQXQizWXzETB2kUumMGTOeeOIJ0YUwm8VbwpqNGIHOnbF9OwBER0c//fTTAC5dQufOiI3VLfPbb5g8WVyJzFZwCGt2+TLOn8f06dWuL1hejvPnqy4QWlaGggIh1TGbwiF8qA4dkJWF6OgaHvrxR0yZgmXLkJaGKVMwY4bFi2M2hN8TPpS/P0aNwvLl+H//D716VXtIJoOvLw4cwObNUCjgwL9F1gC8JazNRx/BxQXTpkHvVBNfX8hk6NIFHh6QydC3r6D6mE3gENbGxwfvvYd9+7B2bQ2PdumCSZP0B/ftw8WL5q+M2RAOYR0UCvTqhchI5ObqP9Sli/4FCLOyEByMvn2xaZPFCmSNHodQX2lptbsODli1Cnl5Bl1L180NTz6JggKEhiIiAmVlZqqR2RQOYZXUVISH47HH9L//ffhwTJ6MNWtw7FgdM7i7IykJSiUcHREXh4AAXLhgvnqZjeAQoqQE69Zh4EAMHIj4eFy+jEOH9JdZsgTu7liwQHe3vBx379Y8m0SCiAjs34+OHZGSgv79sXmzGYuvN4UCY8bgp5+qDZaWYswYKJW6u+fO4fXXLV9ak9OkQ3jtGhYtQvv2eOUVpKbC0xMKBTIz8fjj+kv6+GDxYqSn6+5GRmLgQBw9+tCZBw7E4cN4/nnk5yMkxBpb00OH8OuvCA/HvXtVg2o1fv0Vp0/r7hYW1vYzMlNpoiFMTcXkyfDzw/vvIzcX/ftDpUJWFmJj4edX8ypvvIEhQwCgogI7dyIjA8OGYc2ahz6Fhwc2bqxqTYcPt7rW1MsL2dn4179qeOjkSXz4IdaswbVr+PBDfPgh1Gpcv369b9++W7dutXilNq5phbC0FImJ6NcPAwfiyy8BICQEyclIS4NcDheXqiXfeAOhodXWtbNDfDwiIzFyJP78EwoFiovx+usIC6u2MbmftjXdtw8dO+LQIQwapDsY1Uq0bo2pU6FU4vhx/YdcXeHnh9atIZXCzw9+fpBIYGdnJ5VKHfjQBJOjpiEri6KiqEULAgggX1+KjKTLlxs055dfUvPmBFC3bnT0aG1L3rxJ48cTQBIJKRRUVtag5zWJoUOpVy/KySFPTxo8mNRqIqLCQgJILtctc/QoDRoksMamwvZDuHcvhYSQg4MufjIZqVRUXGyayc+coT59CCBnZ1Iqa1tSoyGlkhwdCaDBg+nCBdMUUG/aEBLRihUEUHw80QMhvHSJFiyoWkWtVr/11luZmZkWL9bG2WwI7969+/nnn4eGfqLNnpMTTZ5MBw+a/omKi0mh0CU8LIzu3q1t4T//pA4dCCBvb9q+3fTFGK4yhOXl1KcPeXlRTo5+CPVs3rwZwN/+9jdL1tkU2GAIMzMzIyMjvby8ADRv7ubvn794MeXkmPdJExPJ1VXXmh47VtuSubk0bpz41rQyhES0bx9JJPT663WEkIiio6OvXr1qmQqbDtsJoVqtTk5ODgkJsf/r6xdkMllCQkKZpf7MT5+m3r11ralKVXup9MEHug55xAjKy7NMgXTnDqlUNHw4FRdXCyERvfIK2dnRvn11hJCZgy2EMD8/X6VSPfbYY9rsOTk5hYWFHT582PKVFBWRXF7Vmt67V9vCe/ZQmzY0ahRVVJi9sKNH6fXXycVFV9uGDfohvHGDvLxo2LDaQpidnd27d+/vvvvO7OU2MY07hBkZGZGRkZ6entr4tW7dOioqKjc3V2xVCQm61rR79zpa05wcunHDjJWo1bR1KwUGkkSii19AACUlUUWFfgiJaNUq3TIPC2FOTs6QIUN+/PFHM1bcJDXKEGo7z6CgIIn2a/iAgICApKSk8vJy0aXpnD5NvXoRQM2a0erVAgrIyyOlkvz8dLlycyO5nE6cqFrgwRCq1TRkCLejAjSyEN65c0epVHbs2FGbPWdn57CwsGO1b24EKSqi114ztDU1odRUksurOs8uXSgmhm7f1l9swQL65z9rWDckpI43tMzkGlMIP/nkk2bNmmnj16VLlxUrVty5c0d0UXWobE179KDjx834RGVllJREgYG67NnZUWAgbd1KGo0Zn5SZRGMK4fr16yUSSWBgYFJSUoUF9maYyKlTVa3pmjWmn//6dYqJoXbtdPFzdye5nE6fNv0TMTNpTCEsLS1NT08XXUV93L1L//d/Va1pYaFppk1JIbmcnJ11M3frRkql5fpeZir8ddmWk5iIadNQVIQePbBxI3r2rOc8ZWX4/nsolfjf/wDAzg7jxyMiAqNH468dVaxREf0q0LScPEk9exJAzZvT+vVERNOnk1xOWVnVFjt7luRy2r1bd3f3bt2xnUS0aRO1bKnb9Hl70/z5dOmSBX8AZgYcQksrKKAXX9SlaPt2cnIigEJDqy2zdy8BtHKl7u66dRQerrudmkoA9e9PKpXJ2lomFp8bZmlubvj6azz5JHbswNixwF9Xpnn5ZYwbp79wSgpOnMD+/cjMxLp1eOQRTJiAtDT072/5wpm5NK2Teq1HeDi++w52dgAQFITHHsPMmSgu1l/s3j3k5uLuXZSUIDcXt28D4ATaGg6heA4OiI3F+fNYvFj/oZEjMXcuxo1D376YOxevvCKiPmZmHEKrEBiIZ5/F0qU4daqGR3190bWrxWtilsIhtBaxsbC3r+F7LwCMHYvZs0XUxCyCQ2gtOnbE22/j99/x9deiS2GWxSG0IvPmwd8f8+ejqEh0KcyCOIRWxMkJn32Gq1exfLnoUpgFcQity5gxCA3Fzz+LroNZEIfQ6sTGwsNDdBHMgjiEgo0apX8kd6tWWLYMgYFo21ZQTcyy+CwKa1FUVPSPf/wjPDx8woQJomthFsVbQmtRWlqakZFx/fp10YUwS+MtIWOC8ZaQMcE4hIwJxiFkTDAOIWOCcQgZE4xDyJhgHELGBOMQMiYYh5AxwTiEjAnGIWRMMA4hY4JxCBkTjEPImGCGhvCPPxAejk8+0R9ftw7h4VCrq0b+/BNTpiAlxUQFMmbrDA3h2bOIj8e8edi5s9r4nj2Ij4dGUzUSG4vERAwahMcfxzffoLzcdMWyxqmkpCQpKUl0FdbLuHbUzQ3Tp6O0tLZlli5FVBRatMCBA3jpJbRrh/nzcfVqg6pkjdfZs2eHDRs2adKkzZs3i67FShkXwjlzkJGBmJjalmndGosWISsLCQno0wc5Ofj4Y3TujNBQ7N/foFpZo7Nly5bBgwcfOXKkQ4cO7dq1E12OtTLwewwTEwmgPXto4kRycqIzZ3TjL79MAJWVPXTFlBQKCyMHB93XYspkpFJRcXEDv1aRWbvi4mKFQqH9G5s4cWJeXp7oiqyX0SE8d46cnSkwUDdeZwi1srIoKoq8vXVR9PWlyEi6fLkBhTMrlpGR0a9fPwBOTk5KpVJ0OdbO6BASUVQUAbqvXDcwhFpFRbR6NfXtq4uiVEpz5/5x4MCB+pVue27fvj1lypQjR46ILqRBNm/e7OnpCaBDhw5//vmn6HIagfqEsKSE/P3J15fy840LYSVtj+rqSj4+fQAMGDBApVIVFRUZWbytOXXqlJOT03rty1sjxC1o/dQnhES0YwcB9PbbVSFcuJBWrqS7d4147itX7r799tve3t7a/zZfX9+FCxdmZWUZ+SM0boWFFBNDS5fqXshKS0u146dOUUwMnT2rW2z3btq9W1CJhjGqBV2/fn3lT8rqGUIiCg4mZ2d66ikC6NIlkkoJIHd3ksvp1CkjKtB+iDR06FBtFO3t7YOCgpKTk435KRqxGzd0zfmSJdXGv/mGANq6VXc3Opqioy1fnaEqW9CuXbsePny4liULCgpeeOEFAAqFwmLlWbn6h/DyZWreXPcHVFJCW7dSYCBJJASQnR0FBtLWraTRGFFKSkpKWFiYo6OjNo39+/dXqVSFhYXG/DiNjzaEUim5utLFi1XjlSHMyKADByg8nMLD6cABOn1aXK01MaoFTU1N7dKlCwA3N7dvvvnGYkVaufqHkIg+/lgXwsr3hKdPk0JBLi668S5dKCaGbt82oqBr167FxMS0adNG+//q6empUCgu3v/naVu0IXz1VWrenJ59tmq8MoSrVtGrr5JMRjIZvfoqLV8urtYHpKenG96CJiQkNGvWTPvyerayz2aGh3D7dpLJKC2t2mBZGY0fTzIZlZdXG79zh5RK6tBBF0U3N5LL6eRJI8oqKSlZt26dTCbTRtHBwSEkJMQmt4raEC5YQB98QAD997+6cetvRw1vQfPz87UtKICwsDDeA6fH0BDWg1pdrUeVSCgwkJKSqKLCiElSUlLkcrmzs/PQoUPNVqlIlSEsLqZOnahdO93OLb0QLl9uRdvA+1vQ4OBgbkEbyIwhrHTmDCkU5Oqq2zB27mx0j5qVldXYPz17mMoQ0l/7nGfPJnoghNbDelrQN998c82aNQ+OKxSK1atXm/a5anT06NGZM2cePHhQb/zYsWM1jj+MJUKodesWLVlSrUd9770rZyqPf2uq7g8hET33HDk40IkTVhpCo1rQSZMmmbUF1e4KenBcIpE899xzJn+6B23ZsgVAYmKi3vh///vfGscfpkEn9ebkYOpUHD5s0MJeXpg7F+fOITkZQUG4dw8//PBp9+7dhw8fvnHjRvX9pyQ2YUolpFLMmlU1oj1ZrLBQXE0AgJKSkoiIiOeff/7OnTvBwcEHDx7Ubg9rlJaWJpPJvv32W20LmpiYqN0esho1KIRffIF//xsDBmDgQCQmGnTqoJ0dAgOxbRuOHVMPGlTg6uq6f//+0NDQ7t27K5XK/Pz8htRjA/z8sHAhfv0VP/6oG4mORng4WrdGeDjOnBFTVUZGxrBhw+Li4pydnZVKZeX2sEaJiYnDhw/PzMzs379/Wlpa5S4Z9lAN2RyfO0eRkdSiha7DbNWKIiPp6lUjZsjPz1epVN27d9cW07x5c7lcfvz48YZU1VgcPEgbNui3o0RUWkrdu5Odna4d3bCBHn9c9xu2s6MJEyg52bgPYBvIqlrQ+8FW2lGHhgS4UyfExGDRIiQlYelSHD+Ojz/GihWYMAGzZuHxx+uewd3dXS6Xv/baa7/99ltsbOz27dvj4+Pj4+MDAgIiIiImTpzo4NCgCq0TEeLiMG8e7O3xyy/6j0qlUKkwcqTu7qRJmDQJhw/jiy/w1Vf4/nt8/z38/TF9OqZORfPmZqyzpKQkMjIyLi4OQHBw8Nq1a2vZAKalpU2aNCkzM9PNzS0+Pt4yG8Br165p/+IfdPbs2T179pjvqXv06KG9kZqa2rz6f8PBgweNm8uELwx791JISINOHczIyFAoFJU/UqdOnWJiYm7evGnCIoXLz6fQUN2vSC6nrCx65BH617/0F5syhR55hHbsqDZ44wbFxFD79rrV63GQoOEq94JqW9DaF1apVE5OTgAGDBhgsQ/ia/mrfu6559atW2dcEowUHh6u3RI+jOFbQtN/Z312NuLj8dlnuHULAHx98fLLmDkTbdsaOkNBQcGGDRuUSuXp06cBODs7h4SEzJ07t3fv3qYt1fJSUzFpEs6dg7s7Vq9GaGh9JtFosH074uLw668AYGeHUaOgUCAoCBKJaercsmXLq6++mp+f37Vr16SkpFr2wRQUFMjl8m+//RZAWFiYSqWy2D4YiUTyzDPP/Oc//9Eb9/X1nTBhwrx589auXWu+Zx85cqSrq2twcPDnn38eEhJy/0M7duyYMmVKYmJiWFiYQXOZ6VWqsJBUKurdW/ea7eREc+acN/yTEyJSq9Xbtm17+umnJRIJAIlEMnr06O+//77CqA/7rYlKpTvMXSajzEwTTHj4MMnlVQcJdu1KMTHUwPOH6vdBvLu7u+U/iIetvCc0++eElT1q797hAGQymUqlKjamSc3IyIiMjNS+G3niiSdat24dFRXVuHrU/HwKCalqQU17Ek9uLn34IbVrp5vfw4Pmzi2vX0+Ynp7et29fWHELej8OoXEuXiyfN29eixYttC+xrVq1ioqKys7ONnyGO3fuKJXKUaNGaWdwcXGRy+XHjh0zX82mkpJCnTvr3sJ9+625nuX+gwSfeOKUnZ1dYGBgUlKS4Y3Dpk2bPDw8APj7+1vVXtCH4RDWR0lJSUJCgva1FoBUKg0JCTHq1EG1Wp2cnBwSEmJvb6+dJCAgICkpqVzvEHKrYfIWtE5HjtCcOZ9XvjHz9/ePi4vLz8+vZRVjW9DOnTtrW9ANGzaYunwjcAgbRO/UwXpc3uLs2bORkZGPPPKIdgZtj5qbm2u+mo1l1ha0TtrGoUOHDtrfj5ubm1wuP3HixINLNq4W9H4DBw6cO3fug+ODBg2aM2eOBQrYtWuXTCbbvn273vju3btrHH8YMSHUys7OjoqKatmypfYPxcfHJzIy8tKlS4bPUFBQoFKpevbsqZ3ByQgEUEQAAAR4SURBVMkpLCzMGg71NrwFVavNWIa2cQgKCqrcuaXXo6alpbm5uWk3mLX/3qykBbVJIkOoVVxc/O9//7t///7a/2BHR8dJkyZdv37d8Bk0Go1ejyqTyRISEkT1qIa3oDk5NGYMrVtn9pLOnDmjUChcXV21v5/OnTvHxMTcunWrvLz8iSeeaEQtqE0SH8JKlT1qy5Ytjdp9WikzMzMyMtLLy0v7p/boo49auEc1qgX95Rfy8dFdf8DYy9XVt7x8pVLZsWNH7e9He5BgnVcltKoW1CZZUQi1rl692sCrPBUUFHz22WeVx6O2adNu6lR1rXv7TCMlhTp1MqgFraigqCjd0aFPPUXG7CQ2Ab0etXLn1oP7Ue9vQeVyeUlJiUULbTKsLoQmtHfv3pCQkKeeiqo8jC4hwVzbHGNbUIDs7SkqyrjrDJhWenp65UGCD3Yf3IJajC2HUCszk956izw9dV1i27b0wQd044bJ5jeqBd25k1q1IoB8fOiXX0xWQ0Pk5eUtW7bs008/vX+QW1BLsv0QahUXU0JC1WF0UimFhND//tfQaQ8dahwtqOHy8/ND/zqklVtQy2gqIaz04KkeNfaoajUlJ9POnfpn7uXmUnIyXbtGGg0plY2vBa3dvXv3tC2oh4fHpk2bRJfTVDS5EGqdP1/H6cjFxbqH1q6ttuIPPxBAq1fThAm6S8jNmtX4WtBazJ8/f8CAAZmWObqHEVGTDaGWtkft06daj7p/v+4hbcZatKD7P+PQhnDtWurWjdzdKSmptvkbSwt6v/Lycm5BLaxJh7DSzp00cSLZ2+vSOHQoXbxIAD37LDk50SuvVC2pDeH69XTsGF24UNuc169TYGBVC2rWI2NYo9agCz3ZjFGjsGULLl9GVBS8vXHzJrTH0nXogDffxLp1+P13/VV698ZfB2bW4Lff0K8ffv0VPj7YsQOLFsGOf9PsIfhPo0rr1li0CJcu4bvvqjLz7rvw8cG0aSgrM2gStRqLFmHMGFy/jlGjcPQoxowxX8nMFnAI9bm44K8DwgHA3R1LluDUKSxbZtDqW7fi/fchkWDxYiQno1UrM5XJbAeHsG5hYRgxAtHRuHSp7oUnTsSsWdi5E++8wy0oMwj/mdRNIsHKlaiowLx5Bi2/YgWefNLMNTEbwiE0SM+eiIhAUhL27RNdCrM5HEJDRUWhbVvExoqug9kcDqGhmjfH8uUoLhZdB7M5HEIjhIRg/HjRRTCbY/orcNsGIly4AHd3eHtXG797F7m58PEx75dAsCaFQ8iYYNyOMiYYh5AxwTiEjAnGIWRMMA4hY4JxCBkTjEPImGAcQsYE4xAyJhiHkDHBOISMCcYhZEwwDiFjgnEIGROMQ8iYYBxCxgTjEDImGIeQMcE4hIwJxiFkTDAOIWOCcQgZE4xDyJhgHELGBOMQMiYYh5AxwTiEjAnGIWRMMA4hY4JxCBkTjEPImGAcQsYE4xAyJhiHkDHBOISMCcYhZEwwDiFjgnEIGROMQ8iYYBxCxgTjEDImGIeQMcH+P8+b8M29lCvgAAABS3pUWHRyZGtpdFBLTCByZGtpdCAyMDIxLjA5LjUAAHice79v7T0GIOBlQABhKL+BkY2hAkgzMzIDWRkgFjMju8IqIIMRxGLQAAuxgWkmFgifiZlRAUQzMsJodoVFYJoZSSucxcaQAGaxQ2gmNoYCMM0EVcIEs4eJmZNBASSC4RImJm4GRg0mRiYFJmYNJmYWBRZWDWY2dgYOTgZOLg4mLm4GHl4WFj5+DmYBQQZBIQ4mEQbxdyCdcP/qpPs6mAow24M4C6YzOPD1H9sHYl93VrTvavGzA7Gjfwnun7XNaD+I3dj1c39T/r29IPZr7tADxabfwGqmbd7mADN02uY2OPtb8l/7i1FsYP6DAkl76Y6D9lD2/sMVUg5QNfv/H35pD9HhYH+4Igqq32E/Ets+yeYoXBzGfui2DMheCmavXqW1NMmmFyZuDxMXAwC1PFCxy7aQKQAAAcB6VFh0TU9MIHJka2l0IDIwMjEuMDkuNQAAeJyNVEtuwkAM3ecUvkBHY3t+XrCApNCqbZBa2jt03/urNiHMIAhiIJJjnj328zMd2Pkc3n7/4Hxo6DoAf+crIvDD3vvuA8yAzfPudYT+sN7Mnn7/PR6+AAWQNUY/l9j1Yf8xexB6YEdeAhF4FxElJTX88dRIUhypVygGePKOSy7obwAZRvUmEgmoBnlMOTc46F92K4TP9bAi+Fm/r3iODBqpmWP2RMmsJEXbvXFH1GKe0EmQyGJI9CUh3kAmy8mOqZRo/YXiy0U5MzDDC0SXZx7mn69wRXGh8rWIE71YK8ySdAZKnAgJ36MBzxPxRwajCGed4PVIlhlUCiYKp1hyATkRPhZLJ1KnktEV0iGGG63hNOIcj26+vuQMDJbyIWRsUyaH6fG609TzcuwZmWFrHao0PRed9jKyTIWf/OFO4dOcl1M2hfOxcJpDn8fhYhOn3dzsx6HuJtlTV9AcXBdNX3Rp+u2uJg2KCRDrorA+qW4DqtBL1TyqTrHRNpn6VEUXORViPqRGoWgqwNAIj22ImBo5oTGOpZENGbMoLQNtv/Y+/4+p3f0DtmL6WmJHlbwAAADvelRYdFNNSUxFUyByZGtpdCAyMDIxLjA5LjUAAHicVY9JbgNBCEWvEsmbRMYIKKCKbnlVkpVVX8Byn8SHD9VuD5FqEMP7fPq5X5fj7bz0w4I9zxaNZ1xcDtt3/b3lwa3WL1/374JCoQKExhzuMAsShRicCEurjWEmdIlQziYh9lphzqJVEvHR5tEoIpOMoWE6ckzNOdlTwSKtWbLaqO1sNSioXFyG+mc0NGo4A2OTHPsYFVFqgLyRPcOb69R8Umk+YqdS1pH9PeQVGdbH0jDrc/+hkVuSgr0g0A9b/4s/sPIkkBYIuMAqEzusNjHf/wAsFVLP+4QuwwAAAABJRU5ErkJggg==",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "display_mols = []\n",
        "for i in range(10):\n",
        "  display_mols.append(gen_mols[i])\n",
        "\n",
        "display_images(mols_to_pngs(display_mols))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2R5K7Y5hedbW"
      },
      "source": [
        "Finally, we can compare generated molecules with our training data via a [similarity search](https://medium.com/gsi-technology/rdkit-for-newbies-3697e617521f) with Tanimoto similarity. This gives an indication of how \"original\" the generated samples are, versus simply producing samples that are extremely similar to molecules the model has already seen. We have to keep in mind that QM9 contains *all* stable small molecules with up to 9 heavy atoms (CONF). So anything new we generate either exists in the full QM9 dataset, or else will not obey the charge neutrality and stability criteria used to generated QM9."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 28,
      "metadata": {
        "id": "RE_vIKDke3Vd"
      },
      "outputs": [],
      "source": [
        "from rdkit.Chem.Fingerprints.FingerprintMols import FingerprintMol\n",
        "from rdkit.DataStructs import FingerprintSimilarity\n",
        "from IPython.display import display\n",
        "\n",
        "def tanimoto_similarity(database_mols, query_mol):\n",
        "    \"\"\"Compare generated molecules to database by Tanimoto similarity.\"\"\"\n",
        "    # convert Mol to datastructure type\n",
        "    fps = [FingerprintMol(m) for m in database_mols]\n",
        "    \n",
        "    # set a query molecule to compare against database\n",
        "    query = FingerprintMol(query_mol)\n",
        "    \n",
        "    similarities = []\n",
        "    \n",
        "    # loop through to find Tanimoto similarity\n",
        "    for idx, f in enumerate(fps):\n",
        "        # tuple: (idx, similarity)\n",
        "        similarities.append((idx, FingerprintSimilarity(query, f)))\n",
        "    \n",
        "    # sort sim using the similarities\n",
        "    similarities.sort(key=lambda x:x[1], reverse=True)\n",
        "    \n",
        "    return similarities"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cCPEN3_cfQ4N"
      },
      "source": [
        "We'll consider our generated molecules and look at the top 3 most similar molecules from the training data by Tanimoto similarity. Here's an example where the Tanimoto similarity scores are medium. There are molecules in our training set that are similar to our generated sample. This might be interesting, or it might mean that the generated molecule is unrealistic."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 29,
      "metadata": {
        "id": "MjR0O1EucwC3"
      },
      "outputs": [],
      "source": [
        "train_mols = [Chem.MolFromSmiles(smiles) for smiles in train_smiles]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 30,
      "metadata": {
        "id": "vsaSkVJufGDy"
      },
      "outputs": [],
      "source": [
        "# change the second argument to compare different generated molecules to QM9\n",
        "tanimoto_scores = tanimoto_similarity(train_mols, gen_mols[3])\n",
        "similar_mols = []"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 31,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 971
        },
        "id": "zgyJ9txQsRxg",
        "outputId": "fc9e811e-ddcf-47f3-f768-e0fac8dea7d5"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "0.521\n",
            "0.471\n",
            "0.468\n"
          ]
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "for idx, ts in tanimoto_scores[:3]:\n",
        "    print(round(ts, 3))\n",
        "    similar_mols.append(train_mols[idx])\n",
        "\n",
        "display_images(mols_to_pngs(similar_mols, 'qm9_mol'))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "G2QHXAFaJnLt"
      },
      "source": [
        "###Molecules of the previous tutorial:\n",
        "\n",
        "![download.png]()\n",
        "\n",
        "![download (9).png]()\n",
        "\n",
        "![download (8).png]()\n",
        "\n",
        "![download (7).png]()\n",
        "\n",
        "![download (6).png]()\n",
        "\n",
        "![download (5).png]()\n",
        "\n",
        "![download (4).png]()\n",
        "\n",
        "![download (3).png]()\n",
        "\n",
        "![download (2).png]()\n",
        "\n",
        "![download (1).png]()\n",
        "\n",
        "\n",
        "These molecules were obteined through sampling.\n",
        "\n",
        "Comparing with the tanimoto similarity:\n",
        "\n",
        "![download (12).png]()\n",
        "\n",
        "![download (11).png]()\n",
        "\n",
        "![download (10).png]()\n",
        "\n",
        "With scores of:\n",
        "- 0.243\n",
        "- 0.243\n",
        "- 0.241"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5oyYuK11xxBO"
      },
      "source": [
        "### Further reading\n",
        "\n",
        "So far we have looked at a measure of validity and done a bit of investigation into the novelty of the generated compounds. There are more dimensions along which we can and should evaluate the performance of a generative model. For an example of some standard benchmarks, see the [GuacaMol evaluation framework](https://arxiv.org/pdf/1811.09621.pdf).\n",
        "\n",
        "For more information about FastFlows look at this [paper](https://arxiv.org/abs/2201.12419) where the workflow is crearly explained.\n",
        "\n",
        "For examples of normalizing flow-based molecular graph generation frameworks, check out the [MoFlow](https://arxiv.org/abs/2006.10137), [GraphAF](https://arxiv.org/pdf/2001.09382.pdf), and [GraphNVP](https://arxiv.org/pdf/1905.11600.pdf) papers."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YdJAF3aEHGbV"
      },
      "source": [
        "# Congratulations! Time to join the Community!\n",
        "\n",
        "Congratulations on completing this tutorial notebook! If you enjoyed working through the tutorial, and want to continue working with DeepChem, we encourage you to finish the rest of the tutorials in this series. You can also help the DeepChem community in the following ways:\n",
        "\n",
        "## Star DeepChem on [GitHub](https://github.com/deepchem/deepchem)\n",
        "This helps build awareness of the DeepChem project and the tools for open source drug discovery that we're trying to build.\n",
        "\n",
        "## Join the DeepChem Gitter\n",
        "The DeepChem [Gitter](https://gitter.im/deepchem/Lobby) hosts a number of scientists, developers, and enthusiasts interested in deep learning for the life sciences. Join the conversation!"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "name": "Copy of Training_a_Normalizing_Flow_on_QM9_2.ipynb",
      "provenance": []
    },
    "interpreter": {
      "hash": "e044b29f6ad82f1590976e6662560528592ec2b6d161e72bf5887bd2674253e2"
    },
    "kernelspec": {
      "display_name": "Python 3.9.4 64-bit ('.venv': venv)",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.9.4"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}
